Laravel中使用with()函数时能否为关联关系设置别名?
在Laravel中给with()的关联关系设置别名当然可以!
嘿,完全没问题的!在Laravel框架里用with()预加载关联数据时,给关联结果设置别名是很常见的需求,我给你分享两种常用的实现方式:
方式1:直接在查询时用闭包自定义别名
如果你不想改动模型代码,只想在单次查询里给关联起别名,可以用数组的方式,把别名作为数组键,闭包里写关联的查询逻辑:
比如你有个User模型,关联了Post表(默认关联方法是posts()),现在要拉取用户和他们最近30天的帖子,并且把这个关联结果叫recent_posts:
$users = User::with([ 'recent_posts' => function ($query) { $query->select('posts.*', 'user_id') ->from('posts') ->where('user_id', '=', \DB::raw('users.id')) ->where('created_at', '>=', now()->subDays(30)); } ])->get();
查询完成后,每个User实例就会多出一个recent_posts属性,里面就是符合条件的帖子数据啦。
方式2:在模型里定义语义化的关联方法(更推荐)
其实更优雅的做法是在模型里新增一个关联方法,相当于用方法名作为“别名”,这样逻辑可以复用,代码也更清晰:
// 在User模型里新增方法 public function recentPosts() { return $this->hasMany(Post::class)->where('created_at', '>=', now()->subDays(30)); } // 查询的时候直接用这个方法名 $users = User::with('recentPosts')->get();
这样后续不管哪里需要查询用户的最近帖子,直接调用with('recentPosts')就行,要调整时间范围的话,改模型里的方法就好,不用到处改查询代码。
嵌套关联也能设别名哦
如果是多层嵌套的关联,比如用户→帖子→评论,想给评论设置别名,同样可以用数组嵌套的方式:
$users = User::with([ 'posts.recent_comments' => function ($query) { $query->where('created_at', '>=', now()->subWeek()); } ])->get();
这里的recent_comments就是评论关联的别名,只要在闭包里写好对应的筛选逻辑就行。
怎么样,这几种方法应该能解决你的需求啦!
内容的提问来源于stack exchange,提问作者Lukho Mdingi
相关产品推荐
相关产品推荐

