CakePHP 3 ORM 的单表继承

安装: 14

依赖项: 0

建议者: 0

安全性: 0

星标: 0

关注者: 1

分支: 7

类型:cakephp-plugin

dev-master / 1.0.x-dev 2018-09-11 23:24 UTC

This package is not auto-updated.

Last update: 2024-09-20 19:45:27 UTC


README

Build Status Coverage Total Downloads License

CakePHP 3 ORM 的单表继承。

[...] 是一种在关系数据库中模拟面向对象继承的方法。在将数据库表映射到面向对象语言中的对象时,数据库中的一个字段标识对象属于层次结构中的哪个类。

(来源: 维基百科)

安装

使用 Composer

composer require muffin/sti:1.0.x-dev

然后需要加载插件。您可以使用以下壳命令

bin/cake plugin load Muffin/Sti

或者手动将下面的语句添加到 bootstrap.php

Plugin::load('Muffin/Sti');

用法

<?php // src/Model/Table/CooksTable.php
namespace App\Model\Table;

use Cake\ORM\Table;

class CooksTable extends Table {

    public function initialize($config)
    {
        $this->table('sti_cooks');
        $this->addBehavior('Muffin/Sti.Sti', [
            'typeMap' => [
                'chef' => 'App\Model\Entity\Chef',
                'baker' => 'App\Model\Entity\Baker',
                'assistant_chef' => 'App\Model\Entity\AssistantChef',
            ]
        ]);

        // Optionally, set the default type. If none is defined, the
        // first one (i.e. `chef`) will be used.
        $this->entityClass('App\Model\Entity\AssistantChef');
    }
}

然后为每种实体类型创建一个类

  • 厨师
  • 面包师傅
  • 副厨师

之前定义的作为 '默认' 的实体需要使用 StiAwareTrait

<?php // src/Model/Entity/AssistantChef.php
namespace App\Model\Entity;

use Cake\ORM\Entity;
use Muffin\Sti\Model\Entity\StiAwareTrait;

class AssistantChef extends Entity
{
    use StiAwareTrait;
}

可选地,您可以为扩展父表以封装业务逻辑的表创建类

<?php // src/Model/Table/ChefsTable.php
namespace App\Model\Table;

class ChefsTable extends CooksTable 
{
  // ...
}

我说可选的,因为如果您只需要一些额外的验证规则,您可以在父表上定义这些规则。例如,为厨师添加自定义规则

// src/Model/Table/CooksTable.php
public function validationChefs(Validator $validator)
{
    // ...
    return $validator;
}

新实体

行为将自动添加创建不同类型实体(即 newChef())的辅助方法。创建新实体有多种方式,所有方式都是有效的,具体取决于情况,您可能需要一个或另一个

// using the parent table
$cooks->newChef([...]);

// or, using the parent table again
$cooks->newEntity(['type' => 'chef', ...]);

// or, using the child table
$chefs->newEntity([...]);

注意

要使上述示例使用 (*chef) 的工作,您需要向 Inflector 添加自定义规则

Cake\Utility\Inflector::rules('plural', ['/chef$/i' => '\1Chefs']);

补丁与功能

  • 分支
  • 修改、修复
  • 测试 - 这很重要,所以它不会意外损坏
  • 提交 - 不要修改许可、todo、版本等。(如果您更改了任何内容,请将它们放入自己的提交中,这样我在拉取时可以忽略它们)
  • 拉取请求 - 主题分支的加分项

为了确保您的 PR 被上游考虑,您必须遵循 CakePHP 编码标准

错误与反馈

http://github.com/usemuffin/sti/issues

许可

版权所有 (c) 2015, Use Muffin,许可协议为 MIT 许可证