我在使用 Eloquent Eager Loading 时遇到了一些问题。我添加了 whereHas
以删除不符合评论标准的博客,但评论仍然返回空数组。我的意图是将其从 json 记录中完全删除。
如何彻底去除不符合我条件的json数据链?
我当前的代码:
User::select("id", "name", "email")
->with(['blog', 'blog.author', 'blog.comments' => function ($query) {
$query->where('comment', 'John is here');
}, 'blog.comments.owner'])
->whereHas('blog.comments', function ($query) {
$query->where('comment', 'John is Here');
})
->get();
我当前的 json 输出是:
{
"id": 1,
"name": "John Smith",
"email": "john.smith@hotmail.com",
"blog": [
{
"id": 1,
"created_at": "2021-04-09T18:08:06.000000Z",
"updated_at": "2021-04-09T10:33:03.000000Z",
"title": "First Blog",
"description": "Awesome",
"users_id": 1,
"cover": null,
"author": {
"id": 1,
"name": "John Smith",
"email": "john.smith@hotmail.com",
"email_verified_at": null,
"created_at": "2021-04-08T13:29:13.000000Z",
"updated_at": "2021-04-08T13:29:13.000000Z",
"role": 0
},
"comments": [
{
"id": 1,
"comment": "John is here",
"blog_id": 1,
"user_id": 1,
"created_at": null,
"updated_at": null,
"owner": {
"id": 1,
"name": "John Smith",
"email": "john.smith@hotmail.com",
"email_verified_at": null,
"created_at": "2021-04-08T13:29:13.000000Z",
"updated_at": "2021-04-08T13:29:13.000000Z",
"role": 0
}
}
]
},
{
"id": 6,
"created_at": "2021-04-12T07:41:43.000000Z",
"updated_at": "2021-04-12T08:01:18.000000Z",
"title": "Second Blog",
"description": "Awesome",
"users_id": 1,
"cover": "images/json_1618213303.png",
"author": {
"id": 1,
"name": "John Smith",
"email": "john.smith@hotmail.com",
"email_verified_at": null,
"created_at": "2021-04-08T13:29:13.000000Z",
"updated_at": "2021-04-08T13:29:13.000000Z",
"role": 0
},
"comments": []
}
]
}
我的预期输出是:
{
"id": 1,
"name": "John Smith",
"email": "john.smith@hotmail.com",
"blog": [
{
"id": 1,
"created_at": "2021-04-09T18:08:06.000000Z",
"updated_at": "2021-04-09T10:33:03.000000Z",
"title": "First Blog",
"description": "Awesome",
"users_id": 1,
"cover": null,
"author": {
"id": 1,
"name": "John Smith",
"email": "john.smith@hotmail.com",
"email_verified_at": null,
"created_at": "2021-04-08T13:29:13.000000Z",
"updated_at": "2021-04-08T13:29:13.000000Z",
"role": 0
},
"comments": [
{
"id": 1,
"comment": "John is here",
"blog_id": 1,
"user_id": 1,
"created_at": null,
"updated_at": null,
"owner": {
"id": 1,
"name": "John Smith",
"email": "john.smith@hotmail.com",
"email_verified_at": null,
"created_at": "2021-04-08T13:29:13.000000Z",
"updated_at": "2021-04-08T13:29:13.000000Z",
"role": 0
}
}
]
}
]
}
最佳答案
试试这个,
User::select("id", "name", "email")
->with([
'blog' => function ($query) {
$query->whereHas('comments', function ($query) {
$query->where('comment', 'John is Here');
});
},
'blog.comments' => function ($query) {
$query->where('comment', 'John is here');
},
'blog.author',
'blog.comments.owner'])
->get();
您也应该对 blog
预加载应用约束。您的查询仅过滤 blog
comments
关于php - 从 Eloquent 集合中删除不匹配的条件记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67191202/