我使用带有()的方法来解决Laravel 5.3渴望加载的关系问题。
我做错了什么,或者我理解错了。
我运行此代码:
$result = Post::with(['comments' => function ($query) { $query->where('content', 'like', '"%blanditiisx%"'); }])->get();
通过经验检查数据库表'评论',我知道,在“内容”栏中只有单个评论“blanditiisx”。
所以,由于给定的评论只能属于一个帖子,而且我们只有一条评论符合'where'条件,我只想找到一个帖子。
令我惊讶的是,上面的代码返回了我在数据库中的所有帖子。
如果有人能告诉我哪里出错了,我将不胜感激。
以下是我正在使用的内容:
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
我有一个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 | | +------------+------------------+------+-----+---------+----------------+
修改
实际上我的初始代码有效,只是以一种令我困惑的方式返回结果。
它的作用是为每个帖子返回一个集合。
大多数都是空的。只有那些属于查询约束的集合才会填充数据。
Rest是空的,但仍然被提取,所以要过滤它们可以使用count()。
当然,他们很渴望。
答案 0 :(得分:4)
您可以尝试使用whereHas()
:
$result = Post::whereHas('comments', function ($query) {
$query->where('content', 'like', '"%blanditiisx%"');
})->with('comments')->get();
它允许为关系约束添加自定义约束,例如检查注释的内容。
或者尝试:
Post::whereHas('comments', function ($query) {
$query->where('content', 'like', '"%blanditiisx%"');
})
->with(['comments' => function ($query) {
$query->where('content', 'like', '"%blanditiisx%"');
}])
->get();
答案 1 :(得分:0)
with()方法用于预加载相关数据,而不是过滤您已有的查询。请参阅whereHas()方法,了解您正在寻找的过滤。