【问题标题】:cakephp 3 saving associated datacakephp 3 保存关联数据
【发布时间】:2015-12-30 00:20:59
【问题描述】:

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

我的控制器操作:

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;

【问题讨论】:

    标签: php cakephp cakephp-3.1


    【解决方案1】:

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

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

    【讨论】:

    • 您可以使用数组访问或Entity::set(),但对于嵌套数据,在大多数情况下您必须手动将属性标记为脏。 book.cakephp.org/3.0/en/orm/…
    • 使用数组访问的时候好像把属性设置为脏了,但是还是没有保存。至少在我的调试输出中是这样说的。
    • ndm,我尝试使用 set 获得与数组访问相同的结果。这些字段像以前一样设置为脏,但没有保存。制作一个数据数组并使用 patchEntity 工作。
    • 我有点怀疑,patchEntity() 在内部也使用了set()dirty(),所以我很确定你遗漏了一些东西,很可能是我评论的后半部分.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-10
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    • 1970-01-01
    相关资源
    最近更新 更多