php - Laravel eloquent 加入 min() 并获得关系的第一个结果
问题描述
我有两个名为products
and的表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
关系进行关联。
现在我想获取两种产品以显示在主页上,但我只需要一个价格最低的商家。
我尝试使用join
where 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
}]
它正确显示第一个产品,仅以最低价格加入商家,但其他产品的价值为空。
我在这里缺少什么?
解决方案
如果您正确定义了雄辩的模型。你可以试试下面的。
为您的产品模型添加额外的关系函数。
public function cheapMerchant() {
return $this->hasOne(Merchant::class, 'product_id')->orderBy('price', 'asc');
}
然后在您的控制器中,通过执行访问数据。
Product::with('cheapMerchant')->get();
这会给你一个cheapMerchant
关系对象。
推荐阅读
- docker - 恢复 Hdfs 文件
- node.js - 如何将 AWS lambda 函数转换为自己的 https 端点?
- python - 按位置连续顺序散开元素
- autodesk-forge - 调用 GET 时使用“forceget”错误:urn/metadata/:guid/properties
- apache-spark - 为什么在所有任务完成之前完成 spark 作业?
- kubernetes - 在 Kubernetes 节点上实现 iptables 规则
- angular - angular 2 完整的用户资料
- async-await - 设置异步调度的执行顺序(redux\redux-saga)
- c# - 在 GeckoFX 中添加功能
- php - 用 laravel 表单上的图标替换提交按钮