对数据透视表created_at的雄辩过滤器

时间:2014-07-02 12:56:41

标签: laravel laravel-4 many-to-many eloquent

我想基于连接它们的数据透视表中的 created_at 列过滤两个具有Eloquent belongsToMany()的表的内容。根据{{​​3}} SO问题,我想出了以下内容:

$data = ModelA::with(['ModelB' => function ($q) {
        $q->wherePivot('test', '=', 1);
    }])->get();

我在这里使用一个简单的测试栏来检查它是否有效,这应该是' created_at'。

但是,如果符合 wherePivot()中的条件,我会使用ModelB信息获取ModelA的所有实例。这是有道理的,因为它正是我告诉它的。

我的问题是如何根据数据透视表中的单个列限制返回的结果?具体来说,我想获得在特定日期之后链接的ModelA和ModelB的所有实例。

2 个答案:

答案 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指的是关系的名称。