首页 > 解决方案 > 是否可以在 Laravel 中执行 orderBy() 或 orderBy()?

问题描述

可以orderBy() or orderBy()在 Laravel Eloquent 中做吗?我当前的查询仅对item.ItemID用户在前端单击排序时进行排序,但在用户单击前端排序时不会排序item.Desc

我尝试使用闭包将这些orderBy()s 放在where()子句中,但这也不起作用。有谁知道我可以纠正这个问题的好方法?

$this->model
    ->join('awards', 'item.ItemID', '=', 'awards.LinkID')
    ->join('opportunities', 'awards.AwardID', '=', 'branch.AwardID')
    ->groupBy('item.ItemID', 'item.Desc')
    ->orderBy('item.ItemID', $clickedDInventoryItemIdFlag ? 'DESC' : 'ASC')
    ->orderBy('item.Desc', $clickedDescriptionColumnFlag ? 'DESC' : 'ASC')
    ->select("item.ItemID", "item.Desc", "branch.OppID")
    ->get();

标签: phplaravellaravel-query-builder

解决方案


SQL 中的排序是累积的,因此您总是按第一项排序,然后是第二项。相反,您可以根据条件操作查询

$this->model
    ->join('awards', 'item.ItemID', '=', 'awards.LinkID')
    ->join('opportunities', 'awards.AwardID', '=', 'branch.AwardID')
    ->groupBy('item.ItemID', 'item.Desc')
    ->when(
        $clickedDescriptionColumnFlag,         // condition
        fn ($q) => $q->orderBy('item.Desc')    // true
        fn ($q) => $q->orderBy('item.ItemID')  // false
    )
    ->select("item.ItemID", "item.Desc", "branch.OppID")
    ->get();

不过我不得不说,每当我看到这样的查询构建器连接发生时,这是一个很大的标志,告诉我你可能不了解模型关系。(尽管问题中没有这样的代码,但您在标题中使用了“Eloquent”这一事实!)我强烈建议您研究Eloquent的工作原理;对于除最重负载之外的所有负载,编码效率的提高远远超过数据库查询效率的轻微下降。


推荐阅读