我有一个Activity
模型,它指的是一个Type
模型。
然后我有一个Schedule
模型可以引用Activity
.
所以我可能想根据活动类型查询时间表(可能是 NULL,但这无关紧要;我只需要 aLEFT JOIN
而不是JOIN
...)。
Laravel4 的Eloquent允许我写一个范围器(这里我想要一个负范围器)并写
Schedule::where(...)->notOfType(myType)->...
尝试使用急切的加载约束结果太尴尬了
Schedule::with(array('activities' => function($query)
{
$query->where('activity_description', 'like', '%lots of lulz%');
}))->get();
...因为这里我不是在查询 的属性Activity
,即 的直接相关模型Schedule
,而是查询 的属性Type
。with
在转向好的 ol' JOIN 之前,我尝试了几个版本的 nested 。
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);
}
意思是根据activity_id将活动加入日程,然后根据type_id将类型加入活动。那时我的选择条件将在类型的名称字段上运行。
没有错误,对于非常非常简单的数据,它甚至可以工作,但仔细检查后发现数据都是错误的。执行的查询和使用 SQL 分析器进行的简单(太简单!)检查发现返回的预期数据只是从 Eloquent 模型中消失。
第一个提示 - 好吧,更多的是咬牙切齿 - 关于正在发生的事情是我的 seeded Schedule
,一旦被过滤器检索到,似乎有一个“类型(1)描述”的描述字段而不是预期的“时间表” (1)说明”。
每当在多个模型中存在具有相同名称的字段时,我都会从错误的模型而不是从Schedule
. 啊哈。事实是 Laravel4 是 PHP 并按顺序检索 SQL 字段作为数组,并且由于SELECT
上述JOIN
s 生成的类似于,
+----------------+-------------+---------+-------------+
| schedule_id | description | type_id | description |
+----------------+-------------+---------+-------------+
| 1 | Sched_Desc | 1 | Type_Desc |
| 2 | Sched2_Desc | 7 | Type7_Desc |
+----------------+-------------+---------+-------------+
...当 PDO 驱动程序检索字段值时,最后一个实例,类型description
的描述,在第四列中,覆盖了第二列中的计划描述。