【问题标题】:Laravel - Extending ModelLaravel - 扩展模型
【发布时间】:2015-11-07 07:31:12
【问题描述】:

我创建了一个从 Model 扩展而来的 BaseModel 类。似乎一切正常,但现在我在保存时遇到了问题。我正在覆盖此 BaseModel 中的 save() 方法。我只想在保存之前为模型添加一些属性。所以我这样做了,然后打电话给return parent::save($options);。方法签名还是一样的:public function save(array $options = [])。

在执行插入时,它似乎在获取 BaseModel 类的名称作为表名(它使用 base_models 作为表名),而不是正在保存的实际模型。有没有人遇到过这个?从模型类扩展的正确方法是什么?

我最初创建了一些特征来处理一些额外的功能,但我认为最好只创建一个基本模型并让我的模型从该模型扩展。

【问题讨论】:

    标签: laravel inheritance eloquent extending-classes


    【解决方案1】:

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

    class SomeChildModel extends BaseModel {
    
        // Manually set the table name
        protected $table = 'table_name';
    
    }
    

    【讨论】:

    • 感谢您的提示!经过一番修改后,我实际上发现了问题所在。
    【解决方案2】:

    我意识到我之前有一个静态方法,它使用 new self() 创建自己的实例,并且会设置一些属性,当我使用来自 trait 的方法时。以前没问题,但现在因为我将方法移到基础模型中,该方法实际上是在基础模型本身而不是具有特征的类上调用的。

    我基本上是使用静态方法来实例化类,因为我已经读过它是避免使构造函数混乱的一种方法。但这次我只是选择在构造函数中执行它,因为它有意义,所以这就是我的解决方案。

    【讨论】:

      【解决方案3】:

      如果没有设置$table 实例变量,Laravel 默认会使用类名(调用save 方法的类)的蛇形大小写。在您的情况下,它将使用 BaseModel 的蛇形大小写作为表名。您有两种解决方案:

      解决方案 1:

      在扩展BaseModel 的类中添加$table 实例变量,如下所示:

      class User extends BaseModel {
          protected $table = 'table_name'; // Your table name in the database;
      }
      

      解决方案 2:

      您可以使用Laravel Eloquent's Events,它允许您连接到模型生命周期中的各个点。

      您可以按如下方式挂钩save 方法并进行更改。您可以在您的BaseClass、traits 等中使用这些方法。例如在您的BaseModel:

      class BaseModel extends Model
      {
          /**
           * Listen for save event
           */
          protected static function boot()
          {
              parent::boot();
      
              static::saving(function($model)
              {
                  if ( ! $model->isValid()) {
                      return false;
                  }
              });
          }
      }
      

      在将模型保存到存储中之前,上述代码将始终调用isValid。在这种情况下,它将返回 false 并且不会保存对象。

      欲了解更多信息,请在此处查看官方docs。如果不清楚,请告诉我。

      【讨论】:

        猜你喜欢
        • 2013-05-10
        • 1970-01-01
        • 2020-09-24
        • 2020-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-21
        • 1970-01-01
        相关资源
        最近更新 更多