robotusers/cakephp-table-inheritance

Robotusers CakePHP STI & CTI 模式插件

0.5.0 2020-11-20 09:08 UTC

This package is auto-updated.

Last update: 2024-09-20 17:06:31 UTC


README

Latest Stable Version Total Downloads Software License Build Status codecov

此插件实现了单一表继承(并有望在未来实现类表继承)模式,用于 CakePHP ORM。

安装

CakePHP 4.x

使用 composer

composer require robotusers/cakephp-table-inheritance

对于 CakePHP 3.x,请使用插件的 0.4 版本

composer require robotusers/cakephp-table-inheritance:^0.4

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);