Php 按关系排序分页(Laravel 5.3)

Php 按关系排序分页(Laravel 5.3),php,laravel,laravel-5,pagination,laravel-5.3,Php,Laravel,Laravel 5,Pagination,Laravel 5.3,在我的应用程序中,我有帖子。我希望在主页上显示所有的帖子,但是如果帖子的用户上传了图片,就把它们排得更高。我可以通过检查用户是否与images表中的一行有关系来确定post的用户是否上传了图像,如下所示: $post->user->image $posts = Post::where('subject_id', '=', $subject->id) ->approved() ->orderBy('created_at', 'des

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

$post->user->image 
$posts = Post::where('subject_id', '=', $subject->id)
        ->approved()
        ->orderBy('created_at', 'desc')
        ->paginate(18);
我的代码当前如下所示:

$post->user->image 
$posts = Post::where('subject_id', '=', $subject->id)
        ->approved()
        ->orderBy('created_at', 'desc')
        ->paginate(18);
目前,我只是简单地通过创建在来订购它,但理想情况下,所有相关用户有图像的帖子都将首先发布,然后是其他帖子。我一直在寻找一种有效的方法来做这件事,而且不只是在第一页上

我该怎么做

试试这个:

$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);
$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);
试试这个:

$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);
$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')方法加载关系,然后联接用户表,从posts表中选择所有字段,从users表中选择唯一图像字段,然后按图像排序结果并对结果分页

结果应该如下所示:

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

  • 身份证
  • 头衔
  • 图像(来自用户表)
  • App\User(渴望加载的关系)
    • 身份证
    • 名字
    • 电子邮件
    • 形象
    • 创建于

这将不仅仅是按照在创建的所有帖子进行排序,并通过图像快速加载所有相关用户吗?@DanielPahor这将按照用户头像、帖子创建日期和快速加载用户进行排序。我在答复中补充了解释。