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