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');
我正在尝试在名为thumbnails
的User
模型上添加第二种方法,这将允许我急切地加载一组特定的用户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 约束急切加载 - 如果关系列应用限制!= 1
如何在 Laravel 中为 ORM 急切加载添加多个键约束?