首页 文章

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

提问于
浏览
0

我使用带()方法的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 回答

  • 0

    你可以尝试 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

  • 2

    with()方法用于预加载相关数据,而不是过滤您已有的查询 . 查看您正在寻找的过滤的whereHas()方法 .

相关问题