【问题标题】:Eloquent eager loaded query not quite working with joins雄辩的急切加载的查询不太适用于连接
【发布时间】:2016-03-27 02:43:13
【问题描述】:

我正在开发一个化学数据库,并且正在学习 Eloquent。这是在 Slim 框架中,而不是在 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(); 

使用上面没有注释掉的地方给我的信息是化学表没有名为公司的列,这是真的。 不使用它,我确实得到了结果:

如您所见,它确实过滤了位置表,但它只是这样做,它不会过滤化学物质,这是我正在尝试做的。

【问题讨论】:

  • 一定要使用join吗?你看过Relationships了吗?
  • 嗨@alexw,我想我必须为这个特定的查询。我使用的关系是一种化学物质属于这 4 个对象中的每一个,而它们又具有一种化学物质。那里还有其他东西可以用来做我想做的事情吗?
  • 好吧,我要说的是(如果我记得你上一个问题的架构),那些join 子句似乎没有必要。在我看来,他们所做的一切就是为您的每种化学品获取关联公司、房间和位置。但是,如果您已经定义了 belongsTo 关系,那么 with 子句应该足以获取每种化学品的关联公司、房间和位置。
  • 在我需要按相关字段之一(如位置)进行过滤之前就足够了。刚刚意识到,当我在上面说“这个线程帮助了我”时,我忘了包括它。 stackoverflow.com/questions/16789285/… 这解释得很好,但我尝试更进一步。
  • 我不确定您的情况是否与该线程中的情况一样复杂。先试试我的回答,看看能不能满足你的需要。

标签: php join eloquent


【解决方案1】:

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

【讨论】:

  • 这个答案有效。很酷。我确实查看了查询日志,它看起来还不错。当然,我现在只有六个条目,但当一切都说完后,我将有接近 2000 个条目。一旦我达到了这一点,我会做更多的测试,如果它真的很慢,我会记住过滤之后的选项。根据您的经验,您认为哪个会更快?非常感谢您的努力
  • 这是一个艰难的决定。如果 Eloquent 必须为 whereHas 生成一个完整的额外查询,那么无论如何它都必须遍历您的集合以合并结果。如果您可以在不需要其他查询的情况下遍历集合,那可能会更快。唯一可以确定的方法是测量时间(例如,使用microtime()
猜你喜欢
  • 1970-01-01
  • 2019-01-26
  • 1970-01-01
  • 2013-09-22
  • 2019-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-02
相关资源
最近更新 更多