关系表上的Laravel查询

时间:2016-12-15 22:39:48

标签: php mysql laravel relation

我的查询laravel表有问题。

我有这样的关系:每个用户都有附件,附件属于用户。我在模型中写了关系。

我的问题是:如果我想返回具有关系附件的用户,但是对于level = user level的附件,如何进行查询?即使我在哪里,它也会让我回复用户的所有附件。请帮忙!

3 个答案:

答案 0 :(得分:2)

如果您想查找附件符合特定约束的用户,请使用whereHas方法

UserModel::whereHas('attachments', function ($attachmentQuery) {
    $attachmentQuery->where('level', 'profile_level');
})->get();

如果您想从已查询的模型中获取特定附件,请写入

$userModel->attachments()->where('level', 'profile_level')->get();

在单个查询中查询UserModel和AttachementModel是不可能的,它必须至少有两个查询。即使是花哨的UserModel::with('attachments')->get();,它返回带有所有附件的用户,也会在内部进行两次查询。

编辑:

我注意到您可以在with方法

中定义relation constraints
UserModel::with(['attachments' => function ($attachmentQuery) {
    $attachmentQuery->where('level', 'profile_level');
}])->get();

因此,如果您希望查找用户,其中附件符合特定约束并急切加载该附件,那么您可以

$queryAttachments = function ($attachmentQuery) {
    $attachmentQuery->where('level', 'profile_level');
};

UserModel::whereHas('attachments', $queryAttachments)
->with(['attachments' => $queryAttachments])->get();

答案 1 :(得分:0)

当您查询模型关系时,您会编写类似

的内容
$attachments = $userModel->attachments;

这是

的快捷方式
$attachments = $userModel->attachments()->get();

所以你可以写

$attachments = $userModel->attachments()->where('level', 'user')->get();

答案 2 :(得分:0)

您可以结合使用whereHaswith方法进行尝试:

Profile::whereHas('attachments', function ($q) {
        $q->where('level', 'user');
    })
    ->with(['attachments', function ($q) {
        $q->where('level', 'user');
    }])
    ->get();