我的查询laravel表有问题。
我有这样的关系:每个用户都有附件,附件属于用户。我在模型中写了关系。
我的问题是:如果我想返回具有关系附件的用户,但是对于level = user level的附件,如何进行查询?即使我在哪里,它也会让我回复用户的所有附件。请帮忙!
答案 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
方法
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)
您可以结合使用whereHas
和with
方法进行尝试:
Profile::whereHas('attachments', function ($q) {
$q->where('level', 'user');
})
->with(['attachments', function ($q) {
$q->where('level', 'user');
}])
->get();