ldrcore / modelling
一个用于大规模系统开发的Laravel扩展包。
Requires
- php: >=7.3
- illuminate/console: >=7.0
- illuminate/database: >=7.0
- illuminate/validation: >=7.0
- laravel/framework: ^8.20
This package is auto-updated.
Last update: 2024-09-21 23:24:57 UTC
README
这个包是为那些认为每个模型都不仅仅是几行代码的人设计的。
此包旨在提供基本功能,将模型作为真正的关系实体用于数据持久化,并提供了其他一些类似数据库的功能,这些功能将提高应用程序的可重用性和可信度。
所有这些功能都允许所有基础类(连接、构建器)在包的配置文件中扩展和轻松定义。
安装
只需简单的 composer require ldrcore/modelling
即可使用。该包使用laravel的自动发现。
模型
模型可以使用我们的特质来扩展功能。使它们不仅仅是查询构建器!
可触发
创建了许多钩子,充当已存在的数据库触发器。在应用级别而不是数据库级别使用这些触发器,可以让你更有效地控制代码更新。这些触发器是自解释的,但如果你感到不舒服,只需查看源代码。这些触发器可以在模型或观察者中创建,当在观察者中使用时,你必须扩展 TriggableObserver
类。
允许的触发器列表
- beforeCreate()
- afterCreated()
- beforeUpdate()
- afterUpdated($changes = [])
- beforeDelete()
- afterDeleted()
- beforeRestore() ¹
- afterRestored($changes = []) ¹
- beforeForceDelete() ¹
- afterForceDeleted() ¹
¹ 仅在启用 "SoftDeletes" 时可用
MassTriggable
当你需要处理大量数据并仍然希望使用可触发的有用性时。
此特质将提供方法,让您可以在大规模操作中控制数据在接触数据库前后的状态,使用优化的语句以获得更好的性能。
只有当定义了方法时,才会使用这些方法,因此您可以将所有模型定义为使用此特质,并且只有当它们被定义时才会使用。
如果没有提供方法,并且模型也实现了可触发的特质的方法,则将使用每条记录的操作。
但如果没有任何大量方法且没有可触发的特质的方法,则将使用Laravel的默认操作。
允许的触发器列表
- beforeMassCreate(array $values)
- afterMassCreated(array $values)
- beforeMassCreateUsing($query, array $values)
- afterMassCreatedUsing($query, array $values)
- beforeMassUpdate($query, array $values)
- afterMassUpdated($query, array $values)
- beforeMassDelete($query)
- afterMassDeleted($query)
- beforeMassForceDelete($query) ¹
- afterMassForceDeleted($query) ¹
¹ 仅在启用 "SoftDeletes" 时可用
Validatable
创建了一组方法和定义,用于为模型创建系统级验证规则。例如,一个用户表包含 "email" 列 not null
。在创建或更新用户电子邮件的每个地方,您都应该需要验证此规则:'email' => 'required'
。但为什么?这完全破坏了可重用性,并允许许多错误。使用此特质,您可以在模型级别定义此规则,并在任何操作中,此规则都将被验证。
此特征还提供了每个操作的规则,如"createRules"、"updateRules"和"deleteRules",并允许您通过使用"getAttributeRule"方法定义规则,该方法将接收规则列表和操作,并必须返回更新后的规则列表,例如
public function getNameAttributeRule($rules, $operation) { return $rules; }
您也可以在另一个类中定义规则,您只需要扩展Rules抽象类,并使用类名定义您的Validatable模型,例如
public $rules = \App\Models\Rules\MyModelRule::class;
可定制
允许用户通过包的配置文件轻松使用,自定义Laravel框架关于模型实例的一些不可定制功能。
允许自定义的列表
- 时间戳名称。
使用此配置,在包的配置文件中定义的时间戳名称将允许您使用您偏好的名称,而无需在蓝图上手动添加,遗憾的是,Laravel没有提供优雅地覆盖基础Model的方法,因此您仍然需要在您的模型上使用特征。
连接
此包还提供连接级别的触发器。它们可以在需要真正发送电子邮件或从您的磁盘中真正删除资源时很有用。这些触发器可以通过"DB"外观使用,并接受闭包作为参数,因此您几乎可以做什么。
允许的触发器列表
- beforeCommit()
- afterCommit()
- beforeRollback()
- afterRollback()
这是一个 Laravel 的 Builder 的新功能,用于避免重复唯一连接,可通过modelling.database.smarty_joins
进行配置。这将允许您使用任何逻辑在查询上放置连接,如果它们完全相同,构建器将不会重复它们。例如
$query = MyModel::where('ative', '=', true); if ($filter1) { $query->join('table2', 'table2.id', '=', 'mytable.id_table2') ->where('table2.filtered', '=', $value); } if ($anotherFilter) { $query->join('table2', 'table2.id', '=', 'mytable.id_table2') ->where('table2.another_column', '=', $value); }
在原始 Laravel 的构建器上,这将为"table2"生成重复的连接子句。使用smarty_joins,将只应用一个连接,以及两个条件!。
可持久化
这是一个特征,允许您快速将"insert"、"update"和"delete"添加到您希望控制这些操作的任何类中,例如,在您的Controller中。通过将此特征添加到您的Controller中,并创建一个包含模型类路径的$model
属性,您将拥有一个易于使用的持久化方法集合。
方法列表
- insert(array $data)
- update(array $data, $ids) ¹
- updateOrInsert(array $data)
- delete($ids) ¹
¹ $ids
可以是单个标识符或标识符列表,以执行批量操作。