Laravel:查询多对多关系,如果第二个表中的条件不成立,则确定第一个表中的行范围

问题描述 投票:0回答:1

我有两个表

posts
employees
,它们具有多对多关系。

现在我想查询数据透视表中

user_id
是登录用户而
status
Accepted
的所有帖子。

我的疑问:

public function accepted()
{
    $posts = Post::with(['employees' => function ($q) {
            $q->wherePivot('status', 'Accepted')
                ->where('user_id', Auth::id());
        }])
        ->with('address', 'service')
        ->orderBy('created_at', 'DESC')
        ->paginate(10);

    return response()->json($posts);
}

如果您查看下图,即使数据透视表中的条件不成立,所有帖子都会返回。

enter image description here

在上图中,有两行,第一行

employees[]
是空的,我不想返回。并且只能返回第二行,因为
employees.pivot
中的条件为 true。

我希望能很好地解释它。

laravel many-to-many laravel-query-builder eloquent-relationship
1个回答
1
投票

将闭包传递给

with
指定要加载哪些相关模型 (
Employee
),但不会过滤您正在查询的模型 (
Post
)。

要添加该过滤器,您需要使用

whereHas(relation, Closure)

$posts = Post::query()
    ->whereHas('employee', function ($rel) {
        $rel->where('your_pivot_table_name.status', 'Accepted')
            ->where('user_id', Auth::id());
    })
    ->with([
        'address',
        'service',
        'employees' => function ($rel) {
            $rel->wherePivot('status', 'Accepted')
                ->where('user_id', Auth::id());
        }
    ])
    ->orderByDesc('created_at')
    ->paginate(10);
© www.soinside.com 2019 - 2024. All rights reserved.