【问题标题】:Laravel: Retrieve instances of superclass with EloquentLaravel:使用 Eloquent 检索超类的实例
【发布时间】:2018-09-25 07:00:07
【问题描述】:

这是我的(简化的)模型:

abstract class Animal extends Illuminate\Database\Eloquent\Model
{
    protected $name;
}

class Cat extends Animal
{
}

class Dog extends Animal
{
}

猫和狗还有其他几个属性。我已经抽象了动物,因为每只动物都是猫或狗,所以不会有动物的实际实例。

现在,我希望能够列出:

  • Cat::all() 应该检索所有猫。
  • Dog::all() 应该检索所有猫。
  • Animal::all() 应该检索所有的猫和狗。

eloquent 通常可以做到这一点吗?如果,是:我应该为此目的使用多态关系吗?

【问题讨论】:

  • 您是否对猫和狗使用单独的表格?
  • 因为它们代表不同的类,我想我应该,不是吗?
  • 这是你的决定。您的超类是否需要比 Animal::all() 更多的功能?
  • 如果可能,全套 Eloquent 操作,如 Animal::find() 等 免责声明:如果 Eloquent 无法提供干净的解决方案,我可以删除子类并使用属性 $而是动物类中的物种。如果可能,我想使用面向对象,但我不知道 Eloquent 是否支持它。
  • 您还有animals 表吗?

标签: php database laravel polymorphism


【解决方案1】:

Eloquent 不支持该功能。

如果CatDog 具有相似的属性,则单个animals 表可能是最好的解决方案。您可以使用范围仅获取一个物种:

class Animal extends Illuminate\Database\Eloquent\Model
{
    public function scopeCats($query)
    {
        return $query->where('species', 'cat');
    }
}

$cats = Animal::cats()->get();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-11
    • 1970-01-01
    • 2019-03-04
    • 2014-09-08
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多