如何在 CakePHP 2 中为 3 个树状连接表保存数据

Posted

技术标签:

【中文标题】如何在 CakePHP 2 中为 3 个树状连接表保存数据【英文标题】:How To Save Data in CakePHP 2 for 3 tree like connected tables 【发布时间】:2018-12-11 10:30:48 【问题描述】:

我有 3 个像连接表一样的树。它们的架构如下:

Member
//Some column


Transactions
member_id :: foreign key of member table
//Some other column


TransactionItems
transaction_id :: foreign key of Transaction table
//Some other column

我这样定义模型:

class Members extends AppModel 

    public $primaryKey = 'id';
    public $hasOne = array(
        'Transactions' => array(
            'className' => 'Transactions',
            'foreignKey' => 'member_id',
            'dependent' => true
        )
    );




class Transactions extends AppModel 

    public $primaryKey = 'id';

    public $belongTo = array('Members');

    public $hasOne = array(
        'TransactionItems' => array(
            'className' => 'TransactionItems',
            'foreignKey' => 'transaction_id',
            'dependent' => true
        )
    );



class TransactionItems extends AppModel 

    public $primaryKey = 'id';

    public $belongTo = array('Transactions');

    public $belongsTo = array(
        'Transactions' => array(
            'className' => 'Transactions',
            'foreignKey' => 'transaction_id'
        )
    );



我有一个要保存到数据库中的数据数组。我的方案是:

Array(

[Members] = [],//Array
[Transactions] = [],//Array
[TransactionItems] = []//Array

)

问题是每当我运行$this->Members->saveAll($data)。它将数据保存在成员和事务表中。但不要在 TransactionItems 表中创建数据。我想一次保存在所有 3 个表中。

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

二级(及以上)关联必须嵌套,即数据结构需要:

array(
    'Members' => array(),
    'Transactions' => array(
        'TransactionItems' => array()
    )
)

有点尴尬,但这就是它在 2.x 中的工作方式。读取数据时可以随时参考返回的结构,保存时需要保持一致。

此外,您必须将deep 选项设置为true 才能保存二级及以上关联(默认情况下仅保存一级关联):

$this->Members->saveAll($data, array('deep' => true));

另见

Cookbook > Models > Saving Your Data > Model::saveAssociated()

【讨论】:

以上是关于如何在 CakePHP 2 中为 3 个树状连接表保存数据的主要内容,如果未能解决你的问题,请参考以下文章

CakePHP 3 更新连接表中的数据

如何使用 CakePHP 3 连接多个表?

在 cakephp 2.x 中如何使用连接表获取第三个表数据?

在 CakePHP 3 中为文章添加评论

CakePHP 3 - 通过其他表连接?

CakePHP 3 连接表关联