【发布时间】:2016-05-26 04:12:48
【问题描述】:
我在 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->E->M 是属于该 E 的 M 的列表,而该 E 又属于 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 的 start_timestamp 字段与字符串“D.start_timestamp”进行比较,而不是 D 的 start_timestamp 值。
问题
是否可以通过较早的相关列值来限制急切加载?如果有,怎么做?
我试过了……
...使用 $query->whereRaw 显式引用早期表的列
$query->whereRaw('M.start_timestamp >= D.start_timestamp')
但此错误将 'D.start_timestamp' 作为未知列。
...使用 whereColumn,但这似乎不适用于急切加载约束(未知列“列”出现错误)。
我试图以“雄辩的方式”解决这个问题,避免使用原始 SQL 和连接。我知道如何通过 SQL 和连接来解决这个问题,但如果可能的话,我宁愿避免它。
如果您能提供任何帮助,我们将不胜感激,谢谢。
【问题讨论】:
-
您是否在请求的模型中创建了任何关系?如果是,请分享您的关系
-
是的,我有,我编辑了问题以提供关系代码。
-
这样的急切加载没有雄辩的方式。你可以使用
whereHas,但很难从你的帖子中看出你真正需要什么。更好地显示您尝试运行的真实模型名称和代码与结果与预期结果。 -
谢谢,我也很怀疑。我需要的内容列在“问题”下,我需要在执行引用其他表中的列的
where时急切加载。但是,从生成的 SQL 来看,这似乎是不可能的,因为急切加载查询似乎独立于第一个查询。
标签: laravel orm laravel-5 eloquent laravel-5.2