【问题标题】:How to correctly extend a Laravel model?如何正确扩展 Laravel 模型?
【发布时间】:2018-02-01 06:15:38
【问题描述】:

我对 Laravel Eloquent 处理模型的方式相当陌生。

我需要创建一个具有一些公共属性和关系的基础 Product 类,以及一些具有一些其他不常见属性的其他类。

我将尝试做一个简单的例子:所有产品都有一个“serial_number”、一个“ship_date”等......

但只有 Bottle 和 Bulb 类有“glass_type”特性,而 Chair 类有另一个。

我正在做一些事情

   abstract class Product extends Model {}
   class Bottle extends Product {}

但我认为这样 Product 没有任何附加的 db $table,我不知道如何处理迁移表和背后的逻辑。

在这里申请的最佳方法是什么?

提前谢谢你

【问题讨论】:

  • 你可以使用特征而不是抽象这样的东西,为了简单起见,迁移只是重复公共列,但如果你有很多公共列,请查看 Laravel 多态关系,看看这个例子:@ 987654321@

标签: php laravel inheritance database-design eloquent


【解决方案1】:

在您的模型(扩展基本模型的子模型)中添加表名,
例如:

class SomeChildModel extends BaseModel {

  // Manually set the table name
  protected $table = 'table_name';

}

【讨论】:

  • 请记住,通过这样做,父类BaseModel 中的$table 属性也将被更改。
  • 嗨 Kuldeep,这样做我们指定了SomeChildModel 的表(当然改变了BaseModel 本身。据我了解,我们必须将SomeChildModel 的所有属性存储在@987654327 中@ 甚至是常见的(对吗?)。我想要一个 base_model 表,其中我们确实拥有所有 id 和公共属性,然后在 SomeChildModel 表中我们引用 BaseModel id 并存储额外的属性。我觉得这样比较合乎逻辑,也许我错了,我不知道
  • 如果你想在使用SomeChildModel时使用BaseModel的雄辩关系,你应该记住外键例如variants for products: class Product extends Model { public function variables() { return $this->hasMany('App\Variant', 'product_id'); } } 然后你也可以使用bottle()->variants()。如果不指定外键,则查询中为bottle_id,不正确。
【解决方案2】:

我们通过在产品模型中包含所有需要的字段来部分“解决”这个问题。此外,我们还引入了 Type 字段(“glass”、“Chair”)并创建了不同的 getter 方法。

除此之外,您可以使用此处描述的更优雅的方法,将每种类型存储在单独的表中:Extending Eloquent Models in Laravel (use different tables)

【讨论】:

  • 感谢您的回答,您是如何组织模型逻辑的?
  • 很抱歉回答迟了。您可以将逻辑放在模型中的开头。但我建议使用您自己的课程作为主要部分。这是您一直在寻找的吗?
猜你喜欢
  • 1970-01-01
  • 2013-12-23
  • 1970-01-01
  • 1970-01-01
  • 2013-05-10
  • 2018-02-18
  • 1970-01-01
  • 2020-09-24
  • 2013-08-01
相关资源
最近更新 更多