繁体   English   中英

laravel中不使用join关系如何通过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');
}

我希望这可以帮助你。

我不知道您为什么要根据Usercreated_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 对于这个用例来说是一种更简单的方法。

Laravel Docs - Eloquent - 子查询排序

嗯,我找到了我想要的。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM