在Laravel 5.2上订购,过滤然后重新排序模型查询

时间:2016-09-02 19:51:44

标签: php mysql laravel-5

我已经连续几个小时没有成功了。

我有一个产品表,我需要从最畅销/评价最高/最受欢迎产品的列表(100个,来自示例)中提取N个随机产品。

使用原始查询这似乎是微不足道的。首先,我们采取100个高价产品,然后我们重新排序,最后采取其中3个。

select * from (select * from `products` order by `valoration` desc limit 100) as products order by RAND() limit 3;

这可以使用DB:table来完成,但我需要使用原始查询来执行相同的查询。这是因为我的Product模型有许多自定义方法,DB:table返回stdObjects列表而不是Product模型集合。

如果没有原始查询,怎么办呢?

感谢。

2 个答案:

答案 0 :(得分:2)

通过内存,您可以使用Illuminate \ Support \ Collection方法获取所需内容。

$selectedProducts = Product::orderBy('valoration')->take(100)->get()->random(3);

答案 1 :(得分:0)

要从原始查询中获取模型对象的集合,您可以使用hydrateRaw()

$products = Product::hydrateRaw("
    select * from (
        select * from `products` order by `valoration` desc limit 100
    ) as products 
    order by RAND() limit 3
");
  

hydrateRaw(string $query, array $bindings = array(), string|null $connection = null)

     

从原始查询创建模型集合。

API