首页 > 解决方案 > Laravel eloquent 加入 min() 并获得关系的第一个结果

问题描述

我有两个名为productsand的表merchants
products表架构:

ID 姓名 蛞蝓
1 产品 产品
2 产品 2 产品-2

merchants表架构:

ID 店铺 价格 mrp product_id
1 亚马逊 99 120 1
2 亚马逊 149 179 2
3 易趣 80 120 1

每个产品可以有多个商家,并使用hasMany关系进行关联。
现在我想获取两种产品以显示在主页上,我只需要一个价格最低的商家。

我尝试使用joinwhere price is min()

Product::leftJoin('merchants', function ($q) {
         $q->on('products.id', '=', 'merchants.product_id')
           ->where('merchants.price', '=', DB::raw("(select min(`price`) from merchants)"));
})->get();

输出是:

[{
    "id": 3, //ID gets replaced by merchant id
    "name": "Product",
    "slug": "product",
    "store": "Ebay",
    "price": 80,
    "mrp": 120
}, {
    "id": null, //ID is null
    "name": "Product 2",
    "slug": "product-2",
    "store": null, //Should be Amazon
    "price": null, //Should be 149
    "mrp": null //Should be 179
}]

它正确显示第一个产品,仅以最低价格加入商家,但其他产品的价值为空。
我在这里缺少什么?

标签: phpmysqllaravel

解决方案


如果您正确定义了雄辩的模型。你可以试试下面的。

为您的产品模型添加额外的关系函数。

public function cheapMerchant() {
    return $this->hasOne(Merchant::class, 'product_id')->orderBy('price', 'asc');
}

然后在您的控制器中,通过执行访问数据。

Product::with('cheapMerchant')->get();

这会给你一个cheapMerchant关系对象。


推荐阅读