Php 按关系排序分页(Laravel 5.3)
在我的应用程序中,我有帖子。我希望在主页上显示所有的帖子,但是如果帖子的用户上传了图片,就把它们排得更高。我可以通过检查用户是否与images表中的一行有关系来确定post的用户是否上传了图像,如下所示: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
$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(渴望加载的关系)
- 身份证
- 名字
- 电子邮件
- 形象
- 创建于