微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Laravel:结合使用 order by 和 whereHas

如何解决Laravel:结合使用 order by 和 whereHas

我想检索一组数据,按关系的 start_date 排序

基本上我想用 Laravel 模型来实现这一点(下面的代码完美无缺)

    $posts = DB::table('posts')
        ->leftJoin(
            'threads','posts.id','=','threads.postable_id'
        )
        ->where('threads.postable_type','App\Post')
        ->orderBy('threads.start_date')
        ->paginate($request->input('limit',2));

因此,在这种情况下,我将获取所有帖子,并且这些帖子按线程关系的 start_date 排序

那些不是我的实际表格,但效果很好!

因为我使用的是 https://laravel.com/docs/8.x/eloquent-resources 这不是检索排序数据的理想解决方案。

所以我想在此处的某处使用 orderBy 子句

    $posts = Post::whereHas('thread',function ($query) {
        $query->where('end_date','>=',Carbon::Now());
    });

但我就是做不到这一点。我试过了

    $posts = Post::whereHas('thread',Carbon::Now())
           ->orderBy('start_date');
    });

而且我还将其附加到实际关系中:

public function thread(): MorphOne
{
    return $this->morphOne('App\Thread','postable')->orderBy('start_date');
}

解决方法

如果您查看代码:

$posts = Post::whereHas('thread',function ($query) {
    $query->where('end_date','>=',Carbon::now())
       ->orderBy('start_date');
});

whereHas 只会返回与函数返回 true 的线程关联的 Post。

试试这个:

$posts = Post::with('thread')->has('thread')->orderBy('thread.start_date')->get();

只有当它们至少有一个 Thread 时,这才会获取所有带有 Thread 的 Post,然后按该 Thread 的 start_date 排序。

您不必执行 whereHas 函数,因为当您调用 ->with('thread') 时,它会使用您:

public function thread(): MorphOne
{
    return $this->morphOne('App\Thread','postable')->orderBy('start_date');
}

whereHas 没有检索到关系。

如果您需要更多功能,您可以使用 whereHas 和 orWhereHas 方法为您的 has 查询定义额外的查询约束,例如检查评论的内容:Laravel whereHas

不要这样做:

$posts = Post::with('thread')->orderBy('thread.start_date');

如果某个帖子没有线程,那么没有线程的帖子将被抓取,其关键线程的值为 null,并且当您尝试 orderBy 时会出现意外结果。

,

首先,我要感谢 Elie Morin 的帮助,但我发现我绝对需要使用连接来完成这项任务。

在我的示例中,我想通过关系的 start_date

对主要查询(帖子)进行排序

按照你的建议去做

$posts = Post::with('thread')->has('thread')->orderBy('thread.start_date')->get();

只会按 start_date 而不是 ENTIRE 查询对线程进行排序。

这就是为什么我想出了这样的东西:

    $posts = Post::has('thread')
        ->select('posts.id')
        ->leftJoin(
            'thread','posts.id','=','thread.postable_id'
        )
        ->where('thread.postable_type','App\Post')
        ->where('thread.end_date',Carbon::now())
        ->orderBy('thread.start_date')
        ->with('thread');

    return PostResource::collection($posts->paginate(2));

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?