【问题标题】:Ordering a pagination by a relationship (Laravel 5.3)按关系排序分页(Laravel 5.3)
【发布时间】:2017-02-14 01:51:27
【问题描述】:

在我的应用中,我有帖子。我希望在主页上显示所有帖子,但如果帖子的用户上传了图片,则将它们排列得更高。我可以通过检查用户是否与 images 表中的行有关系来确定帖子的用户是否上传了图像,如下所示:

$post->user->image 

我的代码目前如下所示:

$posts = Post::where('subject_id', '=', $subject->id)
        ->approved()
        ->orderBy('created_at', 'desc')
        ->paginate(18);

目前,我只是通过创建于来订购它,但理想情况下,所有相关用户有图像的帖子都会先出现,然后是其余的。我一直在寻找一种方法来有效地做到这一点,并且不仅仅适用于第一页。

我应该怎么做?

【问题讨论】:

    标签: php laravel laravel-5 pagination laravel-5.3


    【解决方案1】:

    试试这个:

    $posts = Post::where('subject_id', '=', $subject->id)
            ->approved()
            ->select(['*', DB::raw('(SELECT count(images.id) FROM images INNER JOIN users ON users.image_id = images.id WHERE posts.user_id = users.id) as count_images'])
            ->orderBy('count_images', 'desc')
            ->orderBy('created_at', 'desc')
            ->paginate(18);
    

    【讨论】:

      【解决方案2】:

      试试这个:

      $posts = Post::where('subject_id', '=', $subject->id)
               ->approved()
               ->with('user')
               ->join('users', 'users.id', '=', 'post.user_id')
               ->select(['post.*', 'users.avatar'])
               ->orderBy('image', 'desc')
               ->orderBy('created_at', 'desc') // ->latest() can be used for readability
               ->paginate(18);
      

      此代码急切地加载用户以减少数据库查询的数量,并且不使用应避免的原始查询,因为错误会使您的应用程序容易受到 SQL 注入的攻击。

      说明:

      我们使用 ->with('user') 方法渴望加载关系,然后加入 users 表,从 posts 表中选择所有字段,从 users 表中选择 image 字段,然后按图像排序结果并对结果进行分页。

      结果应如下所示:

      应用\发布:

      • 身份证
      • 标题
      • ...
      • 图片(来自用户表)
      • App\User(渴望加载的关系)
        • 身份证
        • 姓名
        • 电子邮件
        • ...
        • 图片
        • created_at

      【讨论】:

      • 这不仅会按创建时间排序所有帖子,而且会按图像急切加载所有相关用户吗?
      • @DanielPahor 这将按用户头像和帖子创建日期和急切加载用户排序帖子。我在回复中添加了解释。
      猜你喜欢
      • 2021-07-14
      • 2022-01-22
      • 1970-01-01
      • 2015-06-10
      • 2019-05-14
      • 2014-12-10
      • 2015-04-22
      • 1970-01-01
      • 2019-02-17
      相关资源
      最近更新 更多