0

我有一个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,而是查询 的属性Typewith在转向好的 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上述JOINs 生成的类似于,

+----------------+-------------+---------+-------------+
| schedule_id    | description | type_id | description |
+----------------+-------------+---------+-------------+
| 1              | Sched_Desc  | 1       | Type_Desc   |
| 2              | Sched2_Desc | 7       | Type7_Desc  |
+----------------+-------------+---------+-------------+

...当 PDO 驱动程序检索字段值时,最后一个实例,类型description的描述,在第四列中,覆盖了第二列中的计划描述。

4

1 回答 1

1

解决方案一

显而易见的解决方案是只选择我需要的那些字段。由于我在这里进行了范围界定Schedule并且我不太关心相关模型,因此我只是指定了以下Schedule字段select()

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);
}

...并且看,只有Schedule字段被检索,没有更多的字段名称冲突。

解决方案二

另一种解决方案是在字段本身中对表名进行编码,即有一个名为 的字段activity.activity_description,以便activity_description不再与<something-else>_description;冲突。但这感觉更尴尬,而且可能并不总是很方便。

于 2013-10-06T20:41:38.853 回答