Laravel 由父列值约束的雄辩的即时加载

Laravel 由父列值约束的雄辩的即时加载,laravel,orm,laravel-5,eloquent,laravel-5.2,Laravel,Orm,Laravel 5,Eloquent,Laravel 5.2,我使用的是Laravel5.2,我在使用Eloquent检索数据时遇到了一个问题,这些数据需要受到来自其他关系的值的约束。我不确定这种关系模式的正确术语,因此很难找到解决方案 建筑学 为清晰起见,对代码和表格/模型进行了简化: 三个表/模型: E、 D和M 关系: class D extends Model { public function E() { return $this->belongsTo('App\E'); } } class E extends Mod

我使用的是Laravel5.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');
  }
}
模式示例
dem

D和M之间没有直接关系

问题 我想要一个D的列表,其中有E,然后M急切地加载到D对象的属性中,这样$D->E->M是属于E的M的列表,而D又属于E

问题是,我需要通过D列中的值约束M的急切加载。

例如:

$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的
start\u timestamp
字段与字符串“D.start\u timestamp”进行比较,而不是将D的
start\u timestamp
值进行比较

问题: 是否可以通过早期的相关列值来完成对渴望加载的约束?如果是,怎么做

我试过。。。 …使用$query->WHERRAW显式引用早期表的列

$query->whereRaw('M.start_timestamp >= D.start_timestamp')
但是这个错误以“D.start\u timestamp”作为未知列显示

…使用whereColumn,但这似乎不适用于急切加载约束(未知列“column”出错)


我试图以“雄辩的方式”解决这个问题,避免使用原始SQL和联接。我知道如何通过SQL和联接解决这个问题,但如果可能的话,我宁愿避免使用它


如果您能提供任何帮助,我们将不胜感激。

您的上述问题陈述令人困惑,但据我所知,您希望从
D
中急切加载
M
记录,意思是
D->E->M
,并且
D
M
之间没有直接关系。你可以这样做

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();
例如:

D与E有关系

E与M有关系

如果要加载所有相关记录,可以这样做

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

您是否在请求的模型中创建了任何关系?如果是,请分享您的关系是的,我编辑了这个问题以提供关系的代码。没有雄辩的方式可以像这样急切地加载。您可以使用where has,但很难从您的帖子中看出您真正需要什么。更好地显示真实的模型名称和代码,您正试图运行结果与经验的结果。谢谢,我也这么怀疑。我需要的列在“问题”下,我需要在执行引用其他表中的列的
where
时立即加载。但是,从生成的SQL判断,这似乎是不可能的,因为急切加载查询似乎独立于第一个查询。抱歉,不知道如何更清楚地说明这一点,这是我第一次问问题,很难用语言表达。是的,你的例子会奏效,我已经达到了这一点。我需要的是根据D中包含的值仅获取特定的M个记录。因此,例如,如果D记录有一个字段
status
=
10
,我可能希望加载其自身字段
status
大于D记录的
status
字段(10)的M个记录。但是,似乎无法从eager加载M个结果的查询中访问D查询的结果。