Cake PhP 3 Saving associated data in multiples levels

↘锁芯ラ 提交于 2019-12-06 10:49:07

问题


I have a data model where I register an user->customer->contactinfo->email/phone

Each one of these are different tables with respective controllers and everything associated.

When I try to save an user I use the following code:

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

But it only saves the user and the customer.

This is the request data:

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

    )

)

Basically contactinfo table will have an id (autoincremented in the database) and the id of the customer. And each email and phone registered will have the id of the contactinfo.

This is the $user array data:

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
)

You can see that it does not include the contactinfo object so it will not save it.

How can I fix this? Or is there a different way to save multiple levels of associated data?


回答1:


Hey I managed to fix this issue.

First the save function should go like this:

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

Second the request should respect all the levels like this:

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
)

And my ctp looks like this:

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


来源:https://stackoverflow.com/questions/30356200/cake-php-3-saving-associated-data-in-multiples-levels

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!