cakephp 3保存相关数据

时间:2015-12-30 00:21:00

标签: php cakephp cakephp-3.1

我正在尝试保存关联数据,但即使它似乎设置正确,它也不会提交到数据库。我必须明确使用关联表来保存数据。使用'associated'关键字无效。

我的控制器动作:

public function test_associated_save()
{
    $usersTable = TableRegistry::get('Users');
    $test_user = $usersTable->get(21, ['contain' => ['Names']]);
    $test_user['names'][0]['middle'] = 'test name';
    $usersTable->save($test_user);
    $usersTable->save($test_user, ['associated' => ['Names']]);
    debug($test_user);

    $test_user = $usersTable->get(21, ['contain' => ['Names']]);
    debug($test_user);

    $test_user['names'][0]['middle'] = 'test name';
    $namesTable = TableRegistry::get('Names');
    $namesTable->save($test_user['names'][0]);

    $test_user = $usersTable->get(21, ['contain' => ['Names']]);
    debug($test_user);
}

两个$ test_user的调试输出 第一次调试

object(App\Model\Entity\User) {
    'id' => (int) 21,
     ...
    'names' => [
        (int) 0 => object(App\Model\Entity\Name) {
            'id' => (int) 20,
            'user_id' => (int) 21,
            'middle' => 'test name',
            ...
        '[accessible]' => [
         ...
         'middle' => true,
         ...
         ],
            '[dirty]' => [
                'middle' => true
            ],
            '[original]' => [
                'middle' => ''
            ],
            '[virtual]' => [],
            '[errors]' => [],
            '[repository]' => 'Names'
    },
    ...

第二次调试

object(App\Model\Entity\User) {
    'id' => (int) 21,
     ...
    'names' => [
        (int) 0 => object(App\Model\Entity\Name) {
            'id' => (int) 20,
            'user_id' => (int) 21,
            'middle' => '',
            ...
        '[accessible]' => [
         ...
         'middle' => true,
         ...
         ],
            '[dirty]' => [],
            '[original]' => [],
            '[virtual]' => [],
            '[errors]' => [],
            '[repository]' => 'Names'
    },
    ...

第三次调试

object(App\Model\Entity\User) {
    'id' => (int) 21,
     ...
    'names' => [
        (int) 0 => object(App\Model\Entity\Name) {
            'id' => (int) 20,
            'user_id' => (int) 21,
            'middle' => 'test name',
            ...
        '[accessible]' => [
         ...
         'middle' => true,
         ...
         ],
            '[dirty]' => [],
            '[original]' => [],
            '[virtual]' => [],
            '[errors]' => [],
            '[repository]' => 'Names'
    },
    ...

我的用户表

class UsersTable extends Table
{
    public function initialize(array $config)
    {
        $this->table('users');
        $this->displayField('username');
        $this->primaryKey('id');
        $this->addBehavior('Timestamp');
        $this->hasMany('Names', [
            'foreignKey' => 'user_id'
        ]);
        ...
    }
    ...
}

我的名字表

类NamesTable扩展了Table {

/**
 * Initialize method
 *
 * @param array $config The configuration for the Table.
 * @return void
 */
public function initialize(array $config)
{
    $this->table('names');
    $this->displayField('id');
    $this->primaryKey('id');
    $this->addBehavior('Timestamp');
    $this->belongsTo('Users', [
        'foreignKey' => 'user_id',
        'joinType' => 'INNER'
    ]);
}

我的mysql表

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(10) unsigned NOT NULL,
  `username` varchar(50) NOT NULL,
  ...
) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8;


CREATE TABLE IF NOT EXISTS `names` (
  `id` int(10) unsigned NOT NULL,
  `user_id` int(10) unsigned NOT NULL,
  `middle` varchar(255) NOT NULL,
  ...
) ENGINE=InnoDB AUTO_INCREMENT=38 DEFAULT CHARSET=utf8;

1 个答案:

答案 0 :(得分:0)

不要使用数组访问来更改对象值。 在创建更改的数据数组之后,您可以使用patchEntity

    $test_data = [
      'names' => [
          [
             'id' => $test_user['names'][0]['id'],
             'middle' => 'test name 5' 
          ]
      ]
    ];
    $usersTable->patchEntity($test_user, $test_data);