【问题标题】:laravel orm : sort by id but put 0 values of another column at the endlaravel orm :按 id 排序,但将另一列的 0 值放在末尾
【发布时间】:2021-07-18 01:33:47
【问题描述】:

我有一个 Products 表

产品:id、标题、库存、价格

我希望新产品位于列表顶部(首页),但我也希望库存为 0 的产品位于列表末尾(最后一页)

显然,这不符合我的要求,0库存的新产品仍然会首先出现

Product::orderBy('id' , 'desc')->orderBy('stock' , 'desc')->paginate(20)

有很多类似的问题,但似乎都是关于对我不起作用的空值.. 我也试过了

->orderByRaw('stock = 0', 'ASC', 'id' , 'desc' )->paginate(20)

按照建议,但我得到一个空集合

这是一个分页查询,必须在数据库中进行排序,从数据库中读取集合后对集合进行排序是行不通的

------------------------------------ 编辑 ---------- --------------------------

我试过这个代码

Product::orderByRaw('stock = 0', 'ASC')
            ->orderBy('id' , 'desc')
            ->get()

这将在调试器中生成此查询

select * from `products` order by stat_view = 0, `id` desc

当我直接在数据库中尝试时,此代码将起作用,但由于某种原因,在 laravel 中我得到一个空集合....这是一个使用 laravel 5.2 的旧网站,不确定这是否与问题

【问题讨论】:

  • 你可以使用sortByDesc()方法作为Product::orderBy('id' , 'desc')->get()->sortByDesc('stock');
  • @EsTeAa 对不起我的错,我必须更清楚......这是一个分页,所以在查询后对集合进行排序是行不通的
  • 您实际上可以对分页记录进行排序。有关更多信息,请参阅this answer。您可以在集合上使用sort 方法来提供您的自定义排序功能。与 PHP 的内置 uasort 函数完全一样。

标签: php laravel laravel-5


【解决方案1】:

你可以这样做。:

    $products = \App\Models\Product::select(DB::raw('CASE WHEN stock > 0 THEN 1 ELSE 0 END AS priority', 'id', 'title', 'stock', 'created_at'))
    ->orderByDesc('priority')
    ->orderByDesc('created_at')
    ->orderBy('title')
    ->paginate(20);

首先,如果库存超过一个或多个,则按库存排序,然后按 created_at(您需要在数据库中具有时间戳),然后按标题。

【讨论】:

  • 如果你使用 MySQL,你可以使用 IF 而不是 case
【解决方案2】:

试试这个:

$products = Product::orderByRaw('stock = 0', 'ASC')
  ->orderByDesc('id')
  ->paginate(20);

【讨论】:

  • thanx ,我已经编辑了这个问题......知道为什么我在 laravel 中得到空集合吗?
  • @hretic 版本确实是您应该包含在问题中的主要因素(将其添加为标签)。无论如何,我认为这应该有效,但我没有玩过那个版本
【解决方案3】:

您需要更改 orderby 函数的顺序

Product::orderByDesc('stock')->orderByDesc('id')->get();

【讨论】:

  • thanx 但我不想按库存对它们进行排序......我只想让 stock=0 位于列表的末尾
【解决方案4】:

首先按最新产品排序,然后按库存为零,使用以下代码:

$products = Product::orderByDesc('created_at')->orderByRaw('stock = 0', 'ASC')->Paginate(20);

【讨论】:

    猜你喜欢
    • 2011-08-15
    • 1970-01-01
    • 2019-05-05
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-08
    相关资源
    最近更新 更多