如何在 Laravel 的 hasMany 关系中使用 groupBy

Posted

技术标签:

【中文标题】如何在 Laravel 的 hasMany 关系中使用 groupBy【英文标题】:how to use groupBy in hasMany relation in Laravel 【发布时间】:2021-06-15 20:37:57 【问题描述】:

我有 2 张名为 Resort 和 booking 的桌子。在预订表中,有一个名为金额的字段。我想使用 hasMany 关系加入这些表,并使用 groupBy 获取预订表中金额字段的总和。你能帮我解决这个问题吗?

提前致谢

【问题讨论】:

***.com/questions/21679678/… 【参考方案1】:

Laravel Eloquent 有自己的 withSum() 方法来避免“groupBy()”方法。

对于您的情况,您可以使用这样的东西(您可以根据需要进行修改):

// resorts with bookings and their summary prices
$data = Resort::select([
    'id',
    'name',
    'image',
])
    // ->orderBy('some_field', 'ASC')
    ->with(['bookings' => function($query) 
        return $query->select([
            'id',
            'booking_id',
            'price',
        ]);
    ])
    ->withSum('bookings', 'price')
    // ->where('resorts.some_field', '<=', 123)
    ->get();
    // ->toArray();

但不要忘记在您的父(Resort)模型中定义适当的关系:

public function bookings() 
    return $this->hasMany(Booking::class, 'resort_id', 'id');

您还需要在孩子的(预订)迁移中定义“resort_id”外键:

$table->unsignedTinyInteger('resort_id')->nullable();
$table->foreign('resort_id')->references('id')
    ->on('resorts'); // ->onUpdate('cascade')->onDelete('cascade');

【讨论】:

以上是关于如何在 Laravel 的 hasMany 关系中使用 groupBy的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Laravel 中的 hasMany() 关系中获取所有结果?

Laravel 多对多关系( hasMany 或 belongsToMany )

Laravel按hasmany关系排序

Laravel:如何平均嵌套 hasMany 关系(hasManyThrough)

Laravel 5.8 中 hasMany 关系的条件

Laravel 关系查询加载 hasMany + BelongsToMany