雄辩的急切加载查询不能完全使用联接

时间:2016-03-27 02:43:14

标签: php join eloquent

我正在研究化学数据库,正在学习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的列,这是真的。 不使用它,我得到结果:

Table when using the eager loading constraint

正如你所看到的,它确实过滤了位置表,但它只是那样,它不会过滤掉化学物质,这正是我想要做的。

1 个答案:

答案 0 :(得分:0)

如果您想根据相关地点过滤化学品,可以将constraining eager loadsquerying 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也可能对您有帮助。