Laravel - 选择第一个有条件的模型或选择没有条件的随机模型

问题描述 投票:0回答:1

不知道我应该如何命名这个问题。我有一张名为

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 调用的一部分触发的。这样做需要大量重写功能完美的代码。

laravel eloquent
1个回答
0
投票

您可以使用

union
方法来组合两个查询。
union
方法将执行第一个查询;如果没有返回任何结果,则会执行第二个查询。

$priorityProduct = Product::where('priority', '>', 0)->orderBy('priority');
$randomProduct = Product::orderByRaw('RAND()');

$product = $priorityProduct->union($randomProduct)->first();
© www.soinside.com 2019 - 2024. All rights reserved.