我想基于连接它们的数据透视表中的 created_at 列过滤两个具有Eloquent belongsToMany()的表的内容。根据{{3}} SO问题,我想出了以下内容:
$data = ModelA::with(['ModelB' => function ($q) {
$q->wherePivot('test', '=', 1);
}])->get();
我在这里使用一个简单的测试栏来检查它是否有效,这应该是' created_at'。
但是,如果符合 wherePivot()中的条件,我会使用ModelB信息获取ModelA的所有实例。这是有道理的,因为它正是我告诉它的。
我的问题是如何根据数据透视表中的单个列限制返回的结果?具体来说,我想获得在特定日期之后链接的ModelA和ModelB的所有实例。
答案 0 :(得分:3)
好的,这就是它,因为另一个答案仍然是错误的。
首先,wherePivot
无效whereHas
关闭。它是BelongsToMany
方法,仅适用于关系对象(因此在加载时很有效)。
$data = ModelA::with(['relation' => function ($q) use ($someDate) {
$q->wherePivot('created_at', '>', $someDate);
// or
// $q->where('pivot_table.created_at', '>', $someDate);
// or if the relation defines withPivot('created_at')
// $q->where('pivot_created_at', '>', $someDate);
}])->whereHas('ModelB', function ($q) use ($someDate) {
// wherePivot won't work here, so:
$q->where('pivot_table.created_at', '>', $someDate);
})->get();
答案 1 :(得分:-1)
您正在使用Eager Loading Constraints
,仅限于您所说的相关表格的结果。
您想要使用的是whereHas:
$data = ModelA::whereHas('ModelB' => function ($q) {
$q->wherePivot('test', '=', 1);
})->get();
请注意,此处ModelB
指的是关系的名称。