CakePHP 3: Неуспешно запазване на свързания модел

Имам затруднения с използването на Cakephp 3 patchEntity за запазване на свързани модели. Включените модели са обобщени тук

My UsersTempTable

 public function initialize(array $config)
{
    $this->table('users_temp');
    $this->displayField('name');
    $this->primaryKey('id');
    $this->addBehavior('Timestamp');
    $this->hasOne( 'UsersExtraTemp', [
        'foreignKey' => 'user_id'
    ]);

}

След това моята UsersExtraTempTable

public function initialize(array $config)
    {
        $this->table('users_extra_temp');
        $this->displayField('id');
        $this->primaryKey('id');
        $this->belongsTo('UsersTemp', [
            'foreignKey' => 'user_id',
            'joinType' => 'INNER'
        ]);
    }
    public function buildRules(RulesChecker $rules)
    {
        $rules->add($rules->existsIn(['user_id'], 'UsersTemp'));
        return $rules;
    }

Mi функция за запазване на данните:

   $user = $this->newEntity();
   $user = $this->patchEntity($user, $this->request->data, [
              'associated' => ['UsersTemp.UsersExtraTemp']
           ]);
   $this->save( $user, ['associated' => ['UsersExtraTemp']] );

И моят масив от данни се отпечатва от $this->debug()

(
    [name] => name
    [lastname] => lastname
    [email] => [email protected]
    [password] => password
    [passwordConfirm] => repeatPassord
    [UsersExtraTemp] => Array
        (
            [google_token] => sjskdasdadk2
        )

)

Получавам ред, създаден за user_temp в базата данни, но нищо за този user_extra, който очаквам. Някаква представа какво правя грешно, моля?


person rcastellanosm    schedule 27.07.2015    source източник
comment
И така, $this във вашия процес на запазване е UsersTempTable?   -  person ndm    schedule 28.07.2015
comment
Да @ndm .. процесът за запазване е самият модел вместо контролер   -  person rcastellanosm    schedule 29.07.2015


Отговори (1)


Като се има предвид, че $this се отнася до UsersTempTable, опцията associated за patchEntity() не трябва да съдържа това име, тъй като това предполага, че UsersTempTable е свързано с UsersTempTable, което не е така.

Опцията трябва да изглежда точно както при повикването save(), т.е

$user = $this->patchEntity($user, $this->request->data, [
    'associated' => ['UsersExtraTemp']
]);

Също така в данните трябва да използвате правилното име на свойство за асоциацията, което в случай на hasOne асоциация е единственият подчертан вариант на името на асоциацията, т.е. users_extra_temp

(
    // ...

    [users_extra_temp] => Array
        (
            [google_token] => sjskdasdadk2
        )

)

И не на последно място, уверете се, че името на свойството е дефинирано в свойството UsersTemp обекти $_accessible

class UsersTemp extends Entity
{
    // ...

    protected $_accessible = [
        // ...
        'users_extra_temp' => true,
        // ...
    ];

    // ...
}

Вижте също

person ndm    schedule 29.07.2015