繁体   English   中英

Laravel 急切加载关系与添加的条款?

[英]Laravel eager load relationship with added clauses?

我有两个相关的表: 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');
    }
}

我正在尝试在名为thumbnailsUser model 上添加第二种方法,这将允许我急切加载一组特定的用户Images ,而无需先加载所有用户图像。 这是逻辑:

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

这是我一直在称这种关系的方式:

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

使用debugbar ,我正在检查查询:

"sql": "select src, user_id from \"images\" where \"processed\" = 1 and \"images\".\"user_id\" in (12, 14, 15) limit 3", 

这只会返回user.thumbnails第一个Post model。 我的thumbnails方法有问题吗?

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

class User extends Model{

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

在你的 controller

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

您的limit调用不是将 1 个用户的图像限制为 3 个,而是将所有帖子用户图像的整个查询限制为 3 个。它只会为所有用户找到 3 个总图像。

您现在可以删除该limit

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM