Laravel hasMany通过多态关系

Posted

技术标签:

【中文标题】Laravel hasMany通过多态关系【英文标题】:Laravel hasManyThrough a polymorphic relation 【发布时间】:2019-04-04 05:10:34 【问题描述】:

我有一个事务表,其中每个Transaction 都属于DriverCustomer - 所以我在它们之间设置了多态关系。

对于我设置的交易:

public function owner() 
    return $this->morphTo();

对于司机和客户:

public function transactions() 
    return $this->morphMany(Transaction::class, 'owner');

但每个驱动程序也属于一个Company。我正在尝试通过hasManyThrough 关系获取属于Company 的所有事务:

public function transactions() 
    return $this->hasManyThrough(Transaction::class, Driver::class);

但它似乎不适用于多态关系,因为它会引发错误,因为它试图在 transactions 表中查找 driver_id 字段。

通过驱动程序获取属于公司的所有交易的方法是什么?

【问题讨论】:

【参考方案1】:

指定自定义外键并为owner_type 列添加约束:

public function transactions() 
    return $this->hasManyThrough(Transaction::class, Driver::class, null, 'owner_id')
        ->where('owner_type', Driver::class);

如果没有约束,您将获得具有相同id 的不同所有者的交易。

【讨论】:

行得通,谢谢!并且还回答了我关于使用相同的id 与其他所有者进行交易的问题。只剩下一个问题:null 代表什么?我似乎尝试过同样的方法,但是就像`return $this->hasManyThrough(Transaction::class, Driver::class, null, 'owner_id')`。 第三个参数是drivers表中的外键。当你传递 null 时,Laravel 使用默认的 company_id。您也可以显式传递值。

以上是关于Laravel hasMany通过多态关系的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 关系查询加载 hasMany + BelongsToMany

Laravel 5.8 中 hasMany 关系的条件

使用 Eloquent Laravel 获取 hasMany 关系

Laravel 关系,hasmany 和 blongstomany

orderBy on hasMany 关系 laravel

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