多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 模型操作 ### 介绍 October基于[Laravel的Eloquent](http://laravel.com/docs/eloquent)提供了一个漂亮而简单的Active Record实现,用于处理您的数据库。每个数据库表都有一个对应的“模型”,用于与该表进行交互。使用模型可以查询表中的数据,以及将新记录插入表中。 模型类位于插件目录的**models**子目录中。模型目录结构的示例: ~~~ plugins/ acme/ blog/ models/ user/ <=== Model config directory columns.yaml <=== Model config files fields.yaml <==^ User.php <=== Model class Plugin.php ~~~ 模型配置目录可以包含模型的[列表列](https://octobercms.com/docs/backend/lists#list-columns)和[表单字段](https://octobercms.com/docs/backend/forms#form-fields)定义。模型配置目录名称与小写形式的模型类名称匹配。 ### [](https://octobercms.com/docs/database/model#extending-models)扩展模型 由于模型可以[使用行为](https://octobercms.com/docs/services/behaviors),因此可以使用静态`extend`方法对其进行扩展。该方法采用闭包并将模型对象传递到其中。 在闭包内部,您可以向模型添加关系。在这里,我们扩展`Backend\Models\User`模型以包括引用该`Acme\Demo\Models\Profile`模型的配置文件(具有一个)关系。 ~~~ \Backend\Models\User::extend(function($model) { $model->hasOne['profile'] = ['Acme\Demo\Models\Profile', 'key' => 'user_id']; }); ~~~ 此方法还可以用于绑定到[本地事件](https://octobercms.com/docs/database/model#events),以下代码侦听该`model.beforeSave`事件。 ~~~ \Backend\Models\User::extend(function($model) { $model->bindEvent('model.beforeSave', function() use ($model) { // ... }); }); ~~~ > **注意:**通常,放置代码的最佳位置是在插件注册类`boot`方法中,因为它将在每个请求上运行,以确保对模型进行的扩展随处可见。 此外,存在一些扩展受保护模型属性的方法。 ~~~ \Backend\Models\User::extend(function($model) { // add cast attributes $model->addCasts([ 'some_extended_field' => 'int', ]); // add a date attribute $model->addDateAttribute('updated_at'); // add fillable or jsonable fields // these methods accept one or more strings, or an array of strings $model->addFillable('first_name'); $model->addJsonable('some_data'); }); ~~~