【问题标题】:Laravel eager load relationship with added clauses?Laravel 急切加载与添加子句的关系?
【发布时间】:2020-03-08 20:06:34
【问题描述】:

我有两个相关的表:Users & Images

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 模型上添加第二种方法,这将允许我急切地加载一组特定的用户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 模型。我的thumbnails 方法有问题吗?

【问题讨论】:

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


    【解决方案1】:

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

    您现在可以删除 limit

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

    【讨论】:

    • 我想为每个用户获取 3 张图像并且我不想选择 *,我只需要 src 列。如何正确表达?
    【解决方案2】:

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

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

    在你的控制器中

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

    【讨论】:

    • $query->thumbnails();user 模型上,但该范围在Image 模型上...thumbnails 函数在user 模型中的外观如何?
    • @JohnJackson 对不起我的错误
    猜你喜欢
    • 2019-11-05
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    • 2021-12-01
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多