Php Laravel4在相关模型上的范围界定及其怪异之处

Php Laravel4在相关模型上的范围界定及其怪异之处,php,pdo,laravel,laravel-4,Php,Pdo,Laravel,Laravel 4,我有一个活动模型,它指的是类型模型 然后我有一个计划模型,它可能引用一个活动 因此,我可能希望根据活动类型查询计划(可以为NULL,但这与此无关;我只需要一个左连接,而不是连接…) Laravel4的雄辩使我能够编写一个作用域(这里我想要一个负作用域)并编写 Schedule::where(...)->notOfType(myType)->... 结果证明,试着和他一起去太尴尬了 Schedule::with(array('activities' => function($q

我有一个
活动
模型,它指的是
类型
模型

然后我有一个
计划
模型,它可能引用一个
活动

因此,我可能希望根据活动类型查询计划(可以为NULL,但这与此无关;我只需要一个
左连接
,而不是
连接
…)

Laravel4的雄辩使我能够编写一个作用域(这里我想要一个负作用域)并编写

Schedule::where(...)->notOfType(myType)->...
结果证明,试着和他一起去太尴尬了

Schedule::with(array('activities' => function($query)
{
    $query->where('activity_description', 'like', '%lots of lulz%');
}))->get();
…因为这里我不是在查询
活动
的属性,
计划
的直接相关模型,而是在查询
类型
的属性。在转向好的ol'连接之前,我尝试了几个版本的嵌套
s

public function scopeNotOfType($query, $type) {
    $query  
    ->leftJoin('activities',     'schedule.activity_id', '=', 'activities.id')
    ->leftJoin('activity_types', 'activities.type_id',   '=', 'activity_types.id')
    ->where('activity_types.name', '!=', $type->name);
}
这意味着根据活动\ id将活动加入计划,然后根据类型\ id将类型加入活动。此时,我的选择条件将在类型的名称字段上运行

没有错误,对于非常简单的数据,它甚至可以工作,但经过仔细检查,结果证明数据都是错误的。执行的查询和使用SQL分析器进行的简单(太简单!)检查发现了返回的预期数据,结果从雄辩的模型中消失

关于正在发生的事情的第一个提示是,我的种子
计划
,一旦被过滤器检索到,似乎有一个描述字段“Type(1)description”,而不是预期的“计划(1)description”

每当在多个模型中存在同名字段时,我从错误的模型而不是从
Schedule
中获取值。啊哈。事实上,Laravel4是PHP,按顺序以数组的形式检索SQL字段,由于上面的
JOIN
s生成的
SELECT
类似

+----------------+-------------+---------+-------------+
| schedule_id    | description | type_id | description |
+----------------+-------------+---------+-------------+
| 1              | Sched_Desc  | 1       | Type_Desc   |
| 2              | Sched2_Desc | 7       | Type7_Desc  |
+----------------+-------------+---------+-------------+
…当PDO驱动程序检索字段值时,
description
的最后一个实例,第四列中的类型描述,重写了第二列中的计划描述。

解决方案I 显而易见的解决办法是只选择我需要的字段。因为我在这里查看的是
Schedule
,而且我对相关的模型非常关心,所以我只是用
select()
指定了
Schedule
字段:

…现在,只检索
计划
字段,不再存在字段名冲突

解决方案二
另一种解决方案是在字段本身中对表名进行编码,即有一个名为
activity.activity\u description
的字段,以便
activity\u description
不再与
activity\u description
冲突;但这感觉更尴尬,可能并不总是很方便。

请发布答案/解决方案,以供将来参考(我没有读过)。对不起,我在问题中心不在焉地写了它。现在我做对了。谢谢+1、为了努力找出答案并为社区发布答案。
public function scopeNotOfType($query, $type) {
$query 
    ->leftJoin('activities',     'schedule.activity_id', '=', 'activities.id')
    ->leftJoin('activity_types', 'activities.type_id',   '=', 'activity_types.id')
    ->select('schedule.*')
->where('activity_types.name', '!=', $type->name);
}