0

我有以下价格表:

shop_id (int)
product_id (int)
price (float)
created (DateTime)

cronjob 每小时检查一次商店并将新条目(当前价格)插入这些价格表中。

现在我想显示产品的最新价格。我必须按 shop_id 分组,因为我只想要每个商店的一个价格,但我只想要最新的条目(已创建)。

我可以使用 Eloquent Query-Builder 解决这个问题,还是必须使用原始 SQL?如果列相同,是否可以将原始 SQL 查询的结果传递给模型?

4

3 回答 3

1

您可以尝试如下:

Price::select('*', DB::raw('MAX(created_at) as max_created_at'))
      ->groupBy('shop_id')
      ->get()

假设模型名称是Price

于 2016-12-19T06:03:19.280 回答
0

我在没有 QueryBuilder 的情况下解决了这个问题。相反,我使用原始 SQL 语句并使用模型类的 hydraRaw() 函数生成模型。

$prices = Price::hydrateRaw( 'SELECT p.*
      FROM prices p
      INNER JOIN (
        SELECT shop_id, max(created_at) AS max_ca
        FROM prices p1
        GROUP BY shop_id
      ) m ON p.shop_id = m.shop_id AND p.created_at = m.max_ca');
于 2016-12-26T13:59:36.537 回答
0

雄辩(纯粹)的方法:

Price::orderBy('created', 'desc')->groupBy('shop_id')
                                 ->get('shop_id', 'price');

参考:

https://laravel.com/api/5.3/Illuminate/Database/Query/Builder.html#method_orderBy

https://laravel.com/api/5.3/Illuminate/Database/Query/Builder.html#method_groupBy

https://laravel.com/api/5.3/Illuminate/Database/Query/Builder.html#method_get

*虽然未经测试

问:如果列相同,是否可以将原始 SQL 查询的结果传递给模型?

答:您可以将它传递给模型的构造函数- 但它可能需要模型的字段才能填充 - 或者为模型水合。或者,只需像键控数组一样访问它,即。$something[0]['price']<-- 假设价格列的价格数组。

于 2016-12-19T06:15:09.943 回答