![](/img/trans.png)
[英]Laravel 5: How to do a join query on a pivot table using Eloquent?
[英]How to do order by the eloquent query without using join relationship in laravel?
如何使用parent model order laravel eloquent查询? 我的意思是我有一个 eloquent 查询,我想在不使用连接关系的情况下按其父查询排序? 我在上面使用了 whereHas 和 order by,但没有用。
这是我的代码示例:
$query = Post::whereHas('users')->orderBy('users.created_at')->get();
如果您想按user
中的列排序Post
,则必须以某种方式进行连接,除非您在检索结果后进行排序,因此:
$query = Post::select('posts.*')
->join('users', 'users.id', 'posts.user_id')
->orderBy('users.created_at')->get();
请注意,不再需要whereHas
,因为联接(默认情况下是内部联接)只会导致有用户的帖子。
或者,您可以这样做:
$query = Post::has('users')
->with('users')
->get()
->sortBy(function ($post) { return $post->users->created_at; });
原因是雄辩的关系是在与获取父模型的查询不同的查询中查询的,因此您不能在该查询期间使用关系列。
您可以在Post
模型中简单地orderBy
。
public function users(){
return $this->belongsTo(User::class, "user_id")->orderByDesc('created_at');
}
我希望这可以帮助你。
我不知道您为什么要根据User
的created_at
字段订购Post
。 也许,需要从不同的角度来解决问题——比如从User
那里访问Post
。
话虽这么说, orderBy()
可以接受一个闭包作为参数,这将创建一个子查询,然后您可以将它与whereRaw()
配对以在一定程度上规避 Eloquent 和 QueryBuilder 的限制*。
Post::orderBy(function($q) {
return $q->from('users')
->whereRaw('`users`.id = `posts`.id')
->select('created_at');
})
->get();
它应该生成以下查询:
select *
from `posts`
order by (
select `created_at`
from `users`
where `users`.id = `posts`.id
) asc
连接可能会更好地为您服务,但有很多方法可以构建查询。
*据我所知,无法使子查询知道父查询字段
你可以试试
Post::query()
->has('users')
->orderBy(
User::select('created_at')
->whereColumn('id', 'posts.user_id')
->orderBy('created_at')
)
->get();
生成的sql就像
select * from `posts`
where exists (select * from `users` where `posts`.`user_id` = `users`.`id`)
order by (select `created_at` from `users` where `id` = `posts`.`user_id` order by `created_at` asc) asc
但我想 join 对于这个用例来说是一种更简单的方法。
嗯,我找到了我想要的。
Post::query()
->has('users')
->orderBy(
User::select('created_at')
->whereColumn('id', 'posts.user_id')
->orderBy('created_at')
)
->get();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.