Laravel Polymorphic OneToMany

时间:2018-02-04 14:20:01

标签: laravel eloquent polymorphism

我们说我有模型House而House是由不同的元素构建的,如砖块,窗户,门等。

现在我想象我的House模型elmentable()上有一个方法,当我调用$house->elementable()->toArray()时,我得到了一系列不同的元素,如砖块,窗口......以及它们各自的属性或键,如果是一个数组。

不幸的是,我不确定如何实现这一目标以及是否可行。

如何实现上述用例的任何帮助都会很棒。

1 个答案:

答案 0 :(得分:0)

您基本上需要具有子类模型的多态关系。说出从Brick模型继承的WindowSupply模型。

class House extends Model
{

    protected $table = 'houses'

    public function supplies()
    {
        return $this->morphMany(Supply::class, 'house', 'supply_type', 'supply_id');
    }

    public function bricks()
    {
        return $this->supplies()->where('type', 'brick');
    }

    public function windows()
    {
        return $this->supplies()->where('type', 'window');
    }

    public function doors()
    {
        return $this->supplies()->where('type', 'door');
    }

}


class Supply extends Model {
    protected $table = 'supplies';

    public function house()
    {
        return $this->morphTo('house');
    }
}

class Brick extends Supply {}
class Window extends Supply {}
class Door extends Supply {}

这种方法可以为您提供集体供应清单以及很好地分离供应类型的好处。

不是典型的多态关系,但我认为应该有效。