编程语言
首页 > 编程语言> > cakephp3根据类型将一个表链接到多个表

cakephp3根据类型将一个表链接到多个表

作者:互联网

所以这是我的问题.
我需要将保险单链接到被保险财产/物品.现在,细节从汽车政策到房屋或企业,都大相径庭.所以我想做的就是在策略表上有这样的内容

Policies
item_id
item_type

并根据字段“ item_type”的值链接到不同的表,例如:

item_type = car then link to the cars table
item_type = house then link to the houses table
item_type = business then link to the businesses table
and so on...

我可以使用php和mysql自行完成此操作,但我想知道使用CakePHP的表关系和链接来执行此操作的正确方法.我尝试使用直通选项和关系表,但这并不相同.有任何想法吗?或者如果关系表是唯一的方法,请告诉我该如何做.

解决方法:

实际上,这比起初看起来要简单得多.我已经做了几次,所以我将详细介绍我使用的技术.

首先要做的是创建行为.这将允许您启用应用程序中的任何Table类,使其具有附加的策略.

行为非常简单.据我了解,我已对其进行更改以匹配您的示例.我将在代码之后讨论它.

namespace App\Model\Behavior;

use Cake\Event\Event;
use Cake\ORM\Behavior;
use Cake\ORM\Query;

class PolicyBehavior extends Behavior
{
    public function initialize(array $config)
    {
        parent::initialize($config);

        $this->_table->hasMany('Policies', [
            'className' => 'Policies',
            'foreignKey' => 'table_foreign_key',
            'bindingKey' => 'id',
            'conditions' => ['table_class' => $this->_table->registryAlias()],
            'propertyName' => 'policies'
        ]);
    }

    public function beforeFind(Event $event, Query $query, \ArrayObject $options, $primary)
    {
        $query->contain(['Policies']);
        return $query;
    }
}

因此,在initialize方法中,我们需要创建一个与将行为附加到的表的关系.这将创建一个表hasManyPolicy关系,这意味着系统中的任何项目都可以具有许多策略.您可以更新此关系以匹配您的工作方式.

您可以看到在关系中定义了许多选项.这些很重要,因为它们将表项链接在一起.因此,table_foreign_key是策略数据库表中的一个字段,用于存储相关项目的primaryKey.因此,如果您要将策略附加到汽车上,则为Car.id. bindingKey是Policy表中用于联接的键.

为了过滤不同类型的附件,您需要策略db表中的table_class字段.这将是附加表类的名称.因此,我们可以在条件中使用它,因此拉主表类的所有内容都会自动过滤相关策略以进行匹配.

我还配置了propertyName,这意味着您要查找的任何包含策略的项目都将具有一个称为策略的实体属性,其中包含相关数据.

行为中的最后一个函数是beforeFind,这可以确保每当您查找主表类时,总是返回相关策略,如果您不想这样做,则不必使用它,但是我找到了它总是在我的用例中提供相关数据非常方便.

那么,我们如何使用这种新行为?像附加其他任何行为一样附加它就可以了. $this-> addBehavior(‘Policy’).

意识到
这只是读取数据,您需要确保在创建新项目时将表别名以及foreignKey保存到相关表中.

为了清楚起见,您的策略表架构至少需要.

policies.id
policies.table_class VARCHAR(255)
policies.table_foreign_key INT(11)

标签:cakephp,cakephp-3-0,mysql,php,database
来源: https://codeday.me/bug/20191028/1948977.html