繁体   English   中英

cakephp 3保存相关数据

[英]cakephp 3 saving associated data

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

我的控制器动作:

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;

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM