spmartin/cakephp-table-inheritance

CakePHP STI & CTI 模式插件

dev-master 2024-03-22 09:08 UTC

This package is auto-updated.

Last update: 2024-09-22 21:03:35 UTC


README

Latest Stable Version Total Downloads Software License Build Status codecov

此插件实现了 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');
}

现在,ClientsTableAdministratorsTable 将共享 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);

原始代码由 Robert Pustułka 编写 robert.pustulka@gmail.com

https://github.com/robotusers/cakephp-table-inheritance/