Laravel - 在elequent上使用不同的

时间:2017-05-27 12:23:43

标签: php laravel

我想得到最后三个价格(6,7,8)。 我不需要限制。

id: 8是来自id: 5的更新,

id: 8应该显示而不是id: 5

[
    {
        id: 5,
        product_id: 1,
        seller_id: 26,
        color_id: 18,
        warranty_id: 29,
        price: 1000000,
        created_at: "2017-05-27 09:33:44",
    },
    {
        id: 6,
        product_id: 1,
        seller_id: 26,
        color_id: 19,
        warranty_id: 30,
        price: 1200000,
        created_at: "2017-05-27 09:33:56",
    },
    {
        id: 7,
        product_id: 1,
        seller_id: 26,
        color_id: 21,
        warranty_id: 33,
        price: 900000,
        created_at: "2017-05-27 09:34:06",
    },
    {
        id: 8,
        product_id: 1,
        seller_id: 26,
        color_id: 18,
        warranty_id: 29,
        price: 600000,
        created_at: "2017-05-27 10:21:23",
    }
]

我的尝试:

$product->get_prices()
->groupby(['product_id','color_id','warranty_id','seller_id'])
->latest()
->get();
 // 5,6,7,8

Product.php

function get_prices(){
    return $this->hasMany('\App\Price');
}

1 个答案:

答案 0 :(得分:2)

收集版本

您可以在此处使用unique() collection method。作为唯一值,我使用给定ID(卖家,产品,保修和颜色ID)与分隔符的组合(如果需要,可以更改。

之前我使用过reverse()函数,因此唯一函数将返回最后一个重复而不是第一个重复。

然后像往常一样去take():)

$product->get_prices()->get()->reverse()->unique(function ($item) {
    return $item['product_id'] . "|" . $item['seller_id'] . "|" .          
              $item['color_id'] . "|" . $item['warranty_id'];
})->take(3);

您也可以在使用给定解决方案之前发出Eloquent Queries:

$product->get_prices()->with("...")->where("....")
        ->get()->reverse()->unique(function ($item) {
            return $item['product_id'] . "|" . $item['seller_id'] . "|" .          
                   $item['color_id'] . "|" . $item['warranty_id'];
        })->take(3);

ORM版本?

我已经尝试了很多工作的ORM版本,但不幸的是我无法创建一个。 如果你真的想在数据库层上这样做,我猜想更好地使用原始查询。

相关: Distinct most recent data from database