我正在研究化学数据库,正在学习Eloquent。这是在Slim Framework中,而不是Laraval本身。 这个帖子帮助我接近我需要的东西,但现在我看到了一些奇怪的东西,但我找不到解决方案,尽管很多人都在问类似的问题。
我有
$chemicals = $app->Chemical->with(array('Company', 'Room', 'Location', 'Measurement'))
->join('company', 'company_id', '=', 'company.id')
//->join('room', 'room_id', '=', 'room.id')
//->join('location', 'location_id', '=', "location.id")
->where('company', '=', 'ROUSSEL')
->get();
注意2个联接已注释掉。这两个字段在我的表中正确显示,但公司是空白的。如果我切换显示的是哪个联接,那么它就会紧随其后。
如果我不使用任何连接,我可以在其中一个化学领域做得很好。我的问题是为什么有一个连接似乎打破了特定的With语句,有没有办法解决它?我觉得这与With语句做某种幕后加入有关,但我找不到任何细节。 谢谢,
忘记提及我之前尝试过Eager Loading Constraints。
$chemicals = $app->Chemical->with(
array(
'Company',
'Room',
'Measurement',
'Location' => function ($query) {
$query->where('location', '=', 'FLAMCAB');
}
))
//->where('company', '=', 'FISHER')
->get();
使用上面没有注释的地方给我的信息化学品表没有名为company的列,这是真的。 不使用它,我得到结果:
正如你所看到的,它确实过滤了位置表,但它只是那样,它不会过滤掉化学物质,这正是我想要做的。
答案 0 :(得分:0)
如果您想根据相关地点过滤化学品,可以将constraining eager loads与querying relationship existence合并:
$filter = function ($query) {
$query->where('location', '=', 'FLAMCAB');
};
$chemicals = $app->Chemical->with(
array(
'Company',
'Room',
'Measurement',
'Location' => $filter
)
->whereHas('location', $filter)
->get();
我不确定这有多高效 - 您可能想查看生成的查询。另一种选择是在运行查询后使用Collection filters简单地过滤集合。
这个问题:Complex query with filters with Eloquent也可能对您有帮助。