不知道我应该如何命名这个问题。我有一张名为
products
的桌子。简化的架构是:
+--------+-----------+----------+
| id | name | priority |
+--------+-----------+----------+
| 1 | Product 1 | null |
| 2 | Product 2 | 1 |
| 3 | Product 3 | null |
| 4 | Product 4 | null |
| 5 | Product 5 | null |
每次用户单击按钮时,我只想随机获得一种产品。但是,我想先退回任何具有优先级的产品,然后再开始随机退回产品。 (我有一些其他逻辑可以防止同一产品被多次调用)
一个例子是:
$product = Product::where('priority', '>', 0)->sortBy('priority')->first();
if(!$product) {
$product = Product::OrderByRaw('Rand()')->first();
}
这工作得很好,但对我来说有点奇怪,我总是必须运行两个查询才能得到一个结果。
所以我的问题是,是否有一个查询可以用来实现同样的事情?我知道我可以只执行一个数据库查询来获取所有结果,然后从结果集中随机获取一个产品,但在我的实际应用程序中,查询是作为更大的 AJAX 调用的一部分触发的。这样做需要大量重写功能完美的代码。
您可以使用
union
方法来组合两个查询。 union
方法将执行第一个查询;如果没有返回任何结果,则会执行第二个查询。
$priorityProduct = Product::where('priority', '>', 0)->orderBy('priority');
$randomProduct = Product::orderByRaw('RAND()');
$product = $priorityProduct->union($randomProduct)->first();