【发布时间】: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/… 这解释得很好,但我尝试更进一步。
-
我不确定您的情况是否与该线程中的情况一样复杂。先试试我的回答,看看能不能满足你的需要。