由父列值强制执行的急切负载约束

时间:2016-05-26 04:12:48

标签: laravel orm laravel-5 eloquent laravel-5.2

我在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和连接来解决这个问题,但是如果可能的话我宁愿避免使用它。

感谢您提供的任何帮助。

1 个答案:

答案 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();