Laravel 急切加载与添加子句的关系?

Posted

技术标签:

【中文标题】Laravel 急切加载与添加子句的关系?【英文标题】:Laravel eager load relationship with added clauses? 【发布时间】: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 方法有问题吗?

【问题讨论】:

【参考方案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 对不起我的错误

以上是关于Laravel 急切加载与添加子句的关系?的主要内容,如果未能解决你的问题,请参考以下文章

带有嵌套关系的 Laravel 急切加载

Laravel 约束急切加载 - 如果关系列应用限制!= 1

如何在 Laravel 中为 ORM 急切加载添加多个键约束?

Laravel 5.4急切加载belongsToMany关系null绑定

Laravel 动态关系 - 在急切加载时访问模型属性

Laravel Eloquent 中的急切加载