Cake PhP 3以多个级别保存关联数据

时间:2015-05-20 17:12:15

标签: php cakephp cakephp-3.0

我有一个数据模型,我在其中注册用户 - >客户 - > contactinfo->电子邮件/电话

这些表中的每一个都是不同的表,各自的控制器和所有相关的表。

当我尝试保存用户时,我使用以下代码:

 $users = TableRegistry::get('Users');
        $user = $users->newEntity($data, [
            'associated' => ['Customers'],['Contactinfos'],['Phones'],['Emails']
        ]);
        $users->save($user);

但它只能拯救用户和客户。

这是请求数据:

Array
(
[customers] => Array
    (
        [Customer] => Array
            (
                [name] => stackovertest
                [last_name] => stackovertest
                [ssn] => stackovertest
                [address] => stackovertest
                [gender] => male
                [birth] => Array
                    (
                        [year] => 2015
                        [month] => 05
                        [day] => 20
                    )

            )

    )

[emails] => Array
    (
        [Email] => Array
            (
                [email] => stackovertest@test.com
            )

    )

[password] => stackovertest
[phones] => Array
    (
        [Phone] => Array
            (
                [number] => stackovertest
            )

    )

[role_id] => 0
[activation_code] => a026698222d0479252c2712d3d696fbcca8a766d
[tokentime] => 1432141608
[status] => 
[email] => stackovertest@test.com
[contactinfos] => Array
    (
        [contactinfo] => Array
            (
            )

    )

)

基本上,contactinfo表将具有id(在数据库中自动增加)和客户的id。并且每个注册的电子邮件和电话都将具有contactinfo的ID。

这是$ user数组数据:

App\Model\Entity\User Object
 (
[new] => 1
[accessible] => Array
    (
        [email] => 1
        [password] => 1
        [status] => 1
        [activation_code] => 1
        [tokentime] => 1
        [role_id] => 1
        [role] => 1
        [customers] => 1
    )

[properties] => Array
    (
        [customers] => Array
            (
                [0] => App\Model\Entity\Customer Object
                    (
                        [new] => 1
                        [accessible] => Array
                            (
                                [name] => 1
                                [last_name] => 1
                                [ssn] => 1
                                [gender] => 1
                                [birth] => 1
                                [address] => 1
                                [user_id] => 1
                                [user] => 1
                                [aoffers] => 1
                                [hoffers] => 1
                                [poffers] => 1
                            )

                        [properties] => Array
                            (
                                [name] => stackovertest
                                [last_name] => stackovertest
                                [ssn] => stackovertest
                                [address] => stackovertest
                                [gender] => male
                                [birth] => Cake\I18n\Time Object
                                    (
                                        [time] => 2015-05-20T00:00:00+0000
                                        [timezone] => UTC
                                        [fixedNowTime] => 
                                    )

                            )

                        [dirty] => Array
                            (
                                [name] => 1
                                [last_name] => 1
                                [ssn] => 1
                                [address] => 1
                                [gender] => 1
                                [birth] => 1
                            )

                        [original] => Array
                            (
                            )

                        [virtual] => Array
                            (
                            )

                        [errors] => Array
                            (
                            )

                        [repository] => Customers
                    )

            )

        [password] => stackovertest
        [role_id] => 0
        [activation_code] => a026698222d0479252c2712d3d696fbcca8a766d
        [tokentime] => 1432141608
        [status] => 
        [email] => stackovertest@test.com
    )

[dirty] => Array
    (
        [customers] => 1
        [password] => 1
        [role_id] => 1
        [activation_code] => 1
        [tokentime] => 1
        [status] => 1
        [email] => 1
    )

[original] => Array
    (
    )

[virtual] => Array
    (
    )

[errors] => Array
    (
    )

[repository] => Users
)

您可以看到它不包含contactinfo对象,因此不会保存它。

我该如何解决这个问题?或者有不同的方法来保存多级关联数据?

1 个答案:

答案 0 :(得分:2)

嘿,我设法解决了这个问题。

首先,保存功能应该是这样的:

        $user = $users->newEntity($data, [
            'associated' => ['Customers','Customers.Contactinfos','Customers.Contactinfos.Phones','Customers.Contactinfos.Emails']
        ]);
        $users->save($user);

其次,请求应该尊重所有级别:

Array
(
[customers] => Array
    (
        [Customer] => Array
            (
                [name] => test2
                [last_name] => test2
                [contactinfos] => Array
                    (
                        [Contactinfo] => Array
                            (
                                [emails] => Array
                                    (
                                        [Email] => Array
                                            (
                                                [address] => test2@test.test
                                            )

                                    )

                                [phones] => Array
                                    (
                                        [Phone] => Array
                                            (
                                                [number] => test2
                                            )

                                    )

                            )

                    )

                [ssn] => test2
                [address] => test2
                [gender] => male
                [birth] => Array
                    (
                        [year] => 2015
                        [month] => 05
                        [day] => 20
                    )

            )

    )

[password] => test2
[role_id] => 0
[activation_code] => 91c40a9979fcc564a5f27ff09317d6e2f4fdcd58
[tokentime] => 1432154711
[status] => 
[email] => test2@test.test
)

我的ctp看起来像这样:

 <fieldset>
    <legend><?= __('Add User') ?></legend>
    <?php
    echo $this->Form->input('customers.Customer.name');
    echo $this->Form->input('customers.Customer.last_name');
    echo $this->Form->input('customers.Customer.contactinfos.Contactinfo.emails.Email.address', array('label' => 'Email'));
    echo $this->Form->input('password');
    echo $this->Form->input('customers.Customer.contactinfos.Contactinfo.phones.Phone.number',  array('label' => 'Phone'));
    echo $this->Form->input('customers.Customer.ssn', array('label' => 'Cedula'));
    echo $this->Form->input('customers.Customer.address');
    echo $this->Form->input('customers.Customer.gender', array(
        'options' => array('male' => 'Male','female' => 'Female')
    ));
    echo $this->Form->input('customers.Customer.birth');
    echo $this->Form->input('role_id', ['options' => $roles]);
    ?>
</fieldset>