Laravel 5.2,Eloquent,将表 1 连接到表 2 并带上表 2 的 MAX 列

Posted

技术标签:

【中文标题】Laravel 5.2,Eloquent,将表 1 连接到表 2 并带上表 2 的 MAX 列【英文标题】:Laravel 5.2, Eloquent, join Table 1 to Table 2 and bring MAX column of Table 2 【发布时间】:2017-11-20 23:41:07 【问题描述】:

如何使用 Laravel (5.2) 和 Eloquent 实现以下等效 SQL 查询...

SELECT 
     products.id
    ,products.name
    ,MAX(bids.bid_price) as maximum_bid
FROM products
    INNER JOIN bids
        ON products.id = bids.product_id 
GROUP BY products.id

基于以下上下文:

我有一个拍卖系统,其中包含用户出价的产品。这意味着一种产品可以有多个出价,而一个出价只能针对一种产品。

现在我想检索具有当前最高出价的产品

表格:

产品

身份证 姓名

出价

身份证 bid_price product_id

型号:

产品

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Product extends Model

    /**
     * A Product has many bids
     *
     * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
     */
    public function bids()
    
        return $this->hasMany('App\Bid');
    

出价

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Bid extends Model

    /**
     * A Bid belongs to a product
     *
     * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
     */
    public function product()
    
        return $this->belongsTo('App\Product','product_id');
    

【问题讨论】:

【参考方案1】:

试试这个:

DB::table('products')
    ->select(['products.id', 'products.name', DB:raw('MAX(bids.bid_price) as maximum_bid')])
    ->join('bids', 'products.id', '=', 'bids.product.id')
    ->groupBy('products.id')
    ->get();

为特定产品添加 where 子句:

DB::table('products')
    ->select(['products.id', 'products.name', DB:raw('MAX(bids.bid_price) as maximum_bid')])
    ->join('bids', 'products.id', '=', 'bids.product.id')
    ->groupBy('products.id')
    ->where('products.id, '=', 123)
    ->get();

【讨论】:

谢谢,@btl。将其作为查询构建器方法牢记在心,但是否可以使用 Eloquent?【参考方案2】:

这使用 Eloquent 有效。

Product::join('bids', 'products.id', '=', 'bids.product.id')
    ->select(['products.id', 'products.name', DB:raw('MAX(bids.bid_price) as maximum_bid')])
    ->groupBy('products.id')
    ->where('products.id', '=', 123)
    ->get();

【讨论】:

以上是关于Laravel 5.2,Eloquent,将表 1 连接到表 2 并带上表 2 的 MAX 列的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.2 pluck() 来自 Eloquent 模型集合的多个属性

Laravel 5.2 Eloquent 主键作为多键

Laravel Eloquent:通过具有多个关系的枢轴将表绑定到另一个表

Laravel 5.2 Eloquent ORM 从 3 个表中获取数据

升级到 Laravel 5.2 会使所有会话失效

Laravel Eloquent Model :: find不起作用