我在Laravel 5.2上,并且我在使用Eloquent检测数据时遇到了问题,这些关系需要受到来自其他关系的值的约束。我不确定这种关系模式的正确用语,因此很难找到解决方案。
为简化起见,简化了代码和表格/模型:
三个表/模型:
E,D和M.
关系:
class D extends Model
{
public function E()
{
return $this->belongsTo('App\E');
}
}
class E extends Model
{
public function D()
{
return $this->hasMany('App\D');
}
public function M()
{
return $this->hasMany('App\M');
}
}
class M extends Model
{
public function E()
{
return $this->belongsTo('App\E');
}
}
架构示例D <*--1> E <1--*> M
D和M之间没有直接关系。
我想要一个D的列表,用E然后M急切地加载到D对象的属性中,使得$ D-&gt; E-&gt; M是属于那个E的M的列表,其依次为D属于。
问题是我需要急切加载M以受D上列的值约束。
示例:
$D = \App\D::with(['E' => function($query) {
$query->with(['M' => function($query) {
//example of what I'd like to do (but doesn't work)
$query->where('start_timestamp','>=','D.start_timestamp');
}]);
}])->get();
在该示例中,它尝试将M&#39 start_timestamp
字段与字符串&#39; D.start_timestamp&#39;而不是D&#39; start_timestamp
值进行比较。
是否可以通过较早的相关列值来完成约束急切负载?如果是这样,怎么样?
...使用$ query-&gt; whereRaw明确引用早期表格的列
$query->whereRaw('M.start_timestamp >= D.start_timestamp')
但是这会导致&#39; D.start_timestamp&#39;作为一个未知的专栏。
...使用whereColumn,但这似乎不适用于急切的加载限制(错误输出未知列&#39;列&#39;)。
我试图用&#34; Eloquent方式解决这个问题&#34;,避免使用原始SQL和连接。我知道如何通过SQL和连接来解决这个问题,但是如果可能的话我宁愿避免使用它。
感谢您提供的任何帮助。
答案 0 :(得分:0)
您的上述问题陈述令人困惑,但根据我的理解,您希望从M
急切加载D
记录,意味着D -> E -> M
并且{{1}之间没有直接关系}和D
。你可以这样做
例如:
D与E有关系
和
E与M
有关系
并且您想要加载所有相关记录,您可以这样做
M
您的结果将如下所示
家长将包含D记录
D::with(
//this will fetch E records which belongs to D
['E'=>function($q){
//your desire query, which you want to apply on E model/records
$q->where('status','1')->where('problemname', '<>',null);
},
//this will fetch M records which belongs to E
'E.M'=>function($q){
//your desire query, which you want to apply on M model/records
$q->where('status','1')->where('details', '<>',null);
},
])->get();