Laravel渴望与添加的子句建立负载关系?

时间:2019-11-13 03:55:49

标签: mysql sql laravel eager-loading laravel-query-builder

我有两个相关的表:UsersImages

class User extends Model
{
    public function images()
    {
        return $this->hasMany('App\Images');
    }
}

class Image extends Model{

    public function user()
    {
        return $this->belongsTo('App\User');
    }
}

我正在尝试在名为User的{​​{1}}模型上添加第二种方法,这将使我渴望加载一组特定的用户thumbnails,而不必加载所有用户首先要图片。这是逻辑:

Images

这就是我一直以来所说的这种关系:

public function thumbnails () {
    return $this->hasMany('App\Images')
        ->selectRaw('src, user_id')
        ->where('processed', true)
        ->limit(3);
}

使用debugbar,我检查了查询:

$posts = Post::with(['user','user.thumbnails'])->get();

这仅返回"sql": "select src, user_id from \"images\" where \"processed\" = 1 and \"images\".\"user_id\" in (12, 14, 15) limit 3", 的第一个user.thumbnails模型。我的Post方法有问题吗?

2 个答案:

答案 0 :(得分:0)

您可以在内部查询中调用作用域。

class User extends Model{

    public function scopeThumbnails($query)
    {
        return $query->where('processed', true)
        ->limit(3);
    }
}

在您的控制器中

$posts = Post::with(['user' => function($query) {
    $query->thumbnails();
}])->get();

答案 1 :(得分:0)

您的limit调用并没有将1个用户的图像限制为3个,而是将所有帖子的用户图像的整个查询限制为3个。它将仅为所有用户找到3张图像。 / p>

您可以暂时删除该limit

public function thumbnails()
{
    return $this->images()->where('processed', true);
}