Php laravel orm:按id排序,但将另一列的0值放在末尾

Php laravel orm:按id排序,但将另一列的0值放在末尾,php,laravel,laravel-5,Php,Laravel,Laravel 5,我有一张桌子 产品:id、名称、库存、价格 我希望新产品位于列表的顶部(第一页),但我也希望库存为0的产品位于列表的末尾(最后一页) 显然,这不是我想要的方式,一个库存为0的新产品仍然会首先出现 Product::orderBy('id' , 'desc')->orderBy('stock' , 'desc')->paginate(20) 有很多类似的问题,但似乎都是关于空值的,这对我来说并不适用。。我也试过了 ->orderByRaw('stock = 0', 'ASC',

我有一张桌子

产品: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中,我得到了一个空集合。。。。这是一个使用Laravel5.2的旧网站,不确定这是否与问题有关


您需要更改orderby函数的顺序

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

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

你可以这样做

    $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);

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

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

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

您可以使用
sortByDesc()
方法作为
Product::orderBy('id','desc')->get()->sortByDesc('stock')@EsTeAa对不起我的不好,我必须更清楚。。。它是分页的,所以在查询之后对集合进行排序是行不通的。实际上,您可以对分页的记录进行排序。有关更多信息,请参阅。可以对集合使用该方法来提供自定义排序功能。工作原理与PHP的内置函数.thanx完全相同,但我不想按股票对它们进行排序。。。我只想让stock=0出现在列表的末尾如果你使用MySQL你可以使用IF而不是casethanx,我已经编辑了这个问题。。。。知道为什么我在laravel中得到了空的收藏吗?@hretic版本确实是你应该在问题中包含的一个主要因素(将其添加为标记)。不管怎么说,我认为这应该奏效,但我没有玩太多的版本