Laravel 5.3使用带()方法的热切关系

时间:2016-12-08 13:34:59

标签: php laravel-5 eloquent relationship

我使用带有()的方法来解决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()。

当然,他们很渴望。

2 个答案:

答案 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();

Docs

答案 1 :(得分:0)

with()方法用于预加载相关数据,而不是过滤您已有的查询。请参阅whereHas()方法,了解您正在寻找的过滤。