spmartin / cakephp-table-inheritance
CakePHP STI & CTI 模式插件
dev-master
2024-03-22 09:08 UTC
Requires
- php: >=8.0
- cakephp/orm: ^5.0
Requires (Dev)
- php: >=8.0
- cakephp/cakephp: ^5.0
- cakephp/cakephp-codesniffer: @stable
- phpunit/phpunit: ^11.0.7
This package is auto-updated.
Last update: 2024-09-22 21:03:35 UTC
README
此插件实现了 CakePHP ORM 的单表继承(STI)模式(并希望未来实现类表继承CTI模式)。
安装
CakePHP 5.x
使用 composer
composer require spmartin/cakephp-table-inheritance
对于 CakePHP 4.x,请使用插件的 0.5 版本
composer require robotusers/cakephp-table-inheritance:^0.5
StiBehavior
目前仅支持 STI。只需将行为添加到您的表中
//in ClientsTable: public function initialize(array $config) { $this->addBehavior('Robotusers/TableInheritance.Sti', [ 'table' => 'users', 'discriminator' => 'client' ]); } //alternative config in AdministratorsTable: public function initialize(array $config) { $this->table('users'); $this->addBehavior('Robotusers/TableInheritance.Sti'); $this->setDiscriminator('admin'); }
现在,ClientsTable
和 AdministratorsTable
将共享 users
数据库表。表必须有一个 discriminator
字段,用于确定一行中存储的是哪个模型的记录。
多个判别器
您还可以配置允许的判别器列表。例如,当处理文件时很有用。例如
//in ImagesTable: public function initialize(array $config) { $this->addBehavior('Robotusers/TableInheritance.Sti', [ 'table' => 'files', 'discriminatorField' => 'mime', 'acceptedDiscriminators' => [ 'image/jpeg', 'image/gif', 'image/png', 'image/tiff' ] ]); } //or using wildcards: public function initialize(array $config) { $this->addBehavior('Robotusers/TableInheritance.Sti', [ 'table' => 'files', 'discriminatorField' => 'mime', 'acceptedDiscriminators' => [ 'image/*' ] ]); }
ImagesTable
将共享 files
数据库表,并仅匹配指定的 MIME 类型。
您还可以在运行时添加接受的判别器
$table->addAcceptedDiscriminator('image/bmp');
配置
StiBehavior
支持以下选项
discriminatorField
- 用于判别模型的数据库表字段,默认为 'discriminator'discriminator
- 默认判别器值,默认为$table->alias()
table
- 要共享的数据库表,使用此选项或$table->table()
方法。checkRules
- 默认为true
。允许启用/禁用判别器值的内置规则检查。acceptedDiscriminators
- 接受的判别器列表。
StiParentBehavior
此插件还允许配置父表,以便根据子表创建和填充实体。
//in UsersTable: public function initialize(array $config) { $this->addBehavior('Robotusers/TableInheritance.StiParent', [ 'tableMap' => [ 'Administrators' => [ 'admin', 'administrator' ], 'Clients' => 'client' ] ]); }
tableMap
选项接受一个数组,将表注册别名映射到判别器字段值。
您还可以使用 discriminatorMap
选项将判别器值映射到指定的表对象
//in UsersTable: public function initialize(array $config) { $this->addBehavior('Robotusers/TableInheritance.StiParent', [ 'discriminatorMap' => [ 'admin' => $this->tableLocator()->get('Administrators'), 'client' => $this->tableLocator()->get('Clients') ] ]); }
此行为还提供了 newStiEntity()
方法,该方法将代理 newEntity()
到配置的表中之一,基于判别器值。
$data = [ 'name' => 'super-admin', 'discriminator' => 'admin' ]; $admin = $this->Users->newStiEntity($data); //will call AdministratorsTable::newEntity() and return an Administrator entity instance.
之后,您可以使用 stiTable()
方法获取 STI 表,并使用其实际的 Table
对象处理实体。
$table = $this->Users->stiTable($admin); $table->save($admin); //it will save an entity using AdministratorsTable
您还可以直接从数据数组检测 STI 表
$data = [ 'name' => 'super-admin', 'discriminator' => 'admin' ]; $table = $this->Users->stiTable($data); $admin = $table->newEntity($data); $table->save($admin);