我使用带()方法的Laravel 5.3急切加载关系有问题 .
我做错了什么,或者我理解错了 .
我运行这段代码:
$result = Post::with(['comments' => function ($query) {
$query->where('content', 'like', '"%blanditiisx%"');
}])->get();
通过经验检查数据库表'评论',我知道,在“内容”栏中只有单个评论“blanditiisx” .
因此,由于给定的评论只能属于一个帖子而且我们只有一个评论符合'where'条件,我只想获得一个帖子 .
令我惊讶的是,上面的代码返回我在数据库中的所有帖子 .
如果有人能告诉我哪里出错,我将不胜感激 .
Here is what I am working with:
POST
我有Post类,其中定义了这种关系:
/**
* One to Many relation
*
* @return \Illuminate\Database\Eloquent\Relations\hasMany
*/
public function comments()
{
return $this->hasMany(Comment::class);
}
它适用于这个帖子表:
+------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| created_at | timestamp | YES | | NULL | |
| updated_at | timestamp | YES | | NULL | |
| title | varchar(255) | NO | | NULL | |
| slug | varchar(255) | NO | UNI | NULL | |
| summary | text | NO | | NULL | |
| content | text | NO | | NULL | |
| seen | tinyint(1) | NO | | 0 | |
| active | tinyint(1) | NO | | 0 | |
| user_id | int(10) unsigned | NO | MUL | NULL | |
+------------+------------------+------+-----+---------+----------------+
评论
我有一个Comment类,其中定义了这种关系:
/**
* One to Many relation
*
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function post()
{
return $this->belongsTo(Post::class);
}
它适用于此注释表:
+------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| created_at | timestamp | YES | | NULL | |
| updated_at | timestamp | YES | | NULL | |
| content | text | NO | | NULL | |
| seen | tinyint(1) | NO | | 0 | |
| user_id | int(10) unsigned | NO | MUL | NULL | |
| post_id | int(10) unsigned | NO | MUL | NULL | |
| deleted_at | timestamp | YES | | NULL | |
+------------+------------------+------+-----+---------+----------------+
EDIT:
实际上我的初始代码工作,它只是以一种令我困惑的方式返回结果 .
它的作用是为每个帖子返回一个集合 .
他们中的大多数都是空的 . 只有那些属于查询约束的集合才会填充数据 .
休息是空的,但仍然被提取,所以要过滤它们可以使用count() .
当然,他们都很渴望 .
2 回答
你可以尝试
whereHas()
为:它允许向关系约束添加自定义约束,例如检查注释的内容 .
或者尝试:
Docs
with()方法用于预加载相关数据,而不是过滤您已有的查询 . 查看您正在寻找的过滤的whereHas()方法 .