Laravel Eloquent 有很多通过变化,删除重复

Posted

技术标签:

【中文标题】Laravel Eloquent 有很多通过变化,删除重复【英文标题】:Laravel Eloquent has many through variation, remove duplicates 【发布时间】:2021-11-30 03:32:07 【问题描述】:

我一直试图让 Laravel Eloquent 的变体“有很多通过”关系起作用。

我有 3 个模型:Invoice、InvoiceLine 和 Order;我想通过 InvoiceLines 检索给定 Invoice 的所有 Orders 的不同集合。

Invoice 有 1 个或多个 InvoiceLines; InvoiceLine 正好有 1 个 Invoice; InvoiceLine 有零个或 1 个订单;订单有零个或多个 InvoiceLines

以下是表格的简化版本:

发票 身份证 发票行 invoice_id 订单号 订购 订单号

首先我想使用默认的Has Many Through 关系,但这不起作用,因为我的表不同:

然后我想使用多对多 (belongsToMany) 关系:

class Invoice 
    public function orders(): BelongsToMany 
        return $this->belongsToMany(
            Order::class,
            'invoice_line',
            'invoice_id',
            'orderid'
        );
    

上面的代码适用于获取所有订单,但列表中充满了重复。

我如何使用 Laravel 5.6 Eloquent ORM 设置这个 Invoice --> Order 关系,但让订单集合没有任何重复?

如果这在 Eloquent ORM 关系定义中是不可能的,那么我如何以不同的方式查询这些模型,以便我仍然拥有一个面向关系的面向对象的发票集合及其不同的相关订单集?

【问题讨论】:

【参考方案1】:

不确定这是否可以在 Eloquent builder 中完成。也许是这样的:

public function orders(): BelongsToMany 
    return $this->belongsToMany(
        Order::class,
        'invoice_line',
        'invoice_id',
        'orderid'
    )->distinct();

但你也可以这样做:

// class Invoice
public function getRelatedOrders ()

    $orderIdList = $this->invoiceLines->pluck('order_id')->unique();
    return Order::whereIn('id', $orderIdList)->get();

【讨论】:

@Dediqated ->distinct() 工作了吗? 是的,它确实有效!

以上是关于Laravel Eloquent 有很多通过变化,删除重复的主要内容,如果未能解决你的问题,请参考以下文章

功能无法加载有很多关系数据 laravel Model Eloquent

Laravel Eloquent - 返回 Where Has + Where [重复]

Laravel Eloquent 关系有很多错误:在 where 上使用时调用未定义的方法

无法在 Controller Laravel belongsToMany 关系中获取正确的数据 - Laravel / Eloquent [关闭]

通过 eloquent 更新 laravel 中的多行

使用 Laravel Eloquent 使用复合键更新表