Laravel Eloquent 按日期排序,也按排名索引来保存条目
P粉002023326
2023-08-30 14:46:23
<p>我正在使用 Laravel 构建一个项目,并且我有一个包含我所有产品的表。在该表上,产品每天都会添加,并且我会在页面上显示按 <code>created_at</code> 排序的所有产品。使用 Laravel Eloquent 和 <code>->orderBy('created_at', 'DESC')</code> 可以轻松完成这项工作。</p>
<p>但是,我希望能够将某些产品“固定”/“固定”到某个位置。为此,我创建了 <code>rank_index</code> 列,其中包含产品在返回的查询集合中应具有的编号。</p>
<p>这是我当前的表格:</p>
<pre class="brush:php;toolbar:false;">title rank_index created_at
An awesome product 2023-01-01 10:04:00
Another product 4 2023-01-01 10:00:00
Baby car 2023-01-01 10:05:00
Green carpet 2 2023-01-01 10:08:00
Toy 2023-01-01 10:07:00</pre>
<p>下表显示了我希望查询返回的集合:</p>
<pre class="brush:php;toolbar:false;">title rank_index created_at
Toy 2023-01-01 10:07:00
Green carpet 2 2023-01-01 10:08:00
Baby car 2023-01-01 10:05:00
Another product 4 2023-01-01 10:00:00
An awesome product 2023-01-01 10:04:00</pre>
<p>我希望有一个解决方案,可以直接从数据库返回这样的表。这样我就不必对集合进行分割和切片,这使得请求速度慢得多!否则,我必须使用 PHP 函数重新排列、分割和切片集合。</p>
<p>我很高兴能得到任何帮助!</p>
<p>亲切的问候</p>
我几乎肯定会选择银的解决方案
您的声明:
没有什么意义。将两个结果集拆分/切片/拼接在一起不太可能对性能产生可衡量的影响。它肯定不会使“请求变慢”!
这是针对您的场景的 SQL 解决方案,但几乎肯定会比将两个结果集拼接在一起要慢,具体取决于所涉及的表的大小。
如果你有超过 1000 个玩具,递归 cte 将达到默认值cte_max_recursion_depth,如 此处解释。
您可以在上述查询之前运行以下命令来删除限制:
或更改 递归 CTE 到非递归 CTE,其中 toys 表上的“nofollow noreferrer">ROW_NUMBER():
这是一个可以玩的dbfiddle。
我今年就遇到过,直接在查询中排序比较复杂,可以参考这个问题MySQL 结果集按固定位置排序如果你想深入了解它的复杂性。
我之前做的比较简单,通过两个查询完成,
这是一个您可以参考的示例