【问题标题】:Saving data with HABTM and HasMany looses foreignKey使用 HABTM 和 HasMany 保存数据会丢失外键
【发布时间】:2023-03-20 21:01:01
【问题描述】:

我有一个包含两个关系的用户模型:

  1. HasAndBelongsToMany

    public $hasAndBelongsToMany = array(
        'group' => array(
            'className' => 'group',
            'foreignKey' => 'user_id'
        )
    );
    
  2. 有很多

    public $hasMany = array(
      'phonenumber' => array(
        'className' => 'phonenumber',
        'foreignKey' => 'user_id'
      )
    );
    

电话号码和群组已设置

public $belongsTo = array(
    'User' => array(
        'className' => 'User',
        'foreignKey' => 'user_id'
    )
);

当我使用时

$this->saveAll(array(
            'User' => $data, 
            'phonenumber' => $numbers, //array with data
            'group' => $groups //array with data
   )
);

数据保存在表格中,但电话号码和组表中的 User_id 为“0”。

我怎样才能得到正确的ID保存? (CakePHP v 2.5)

【问题讨论】:

  • 能否将数组的$data、$numbers&$groups中存储的相关数据添加进去?
  • 它有普通的用户数据,比如 $data = array('name' => 'Jeff', 'country' => 'USA') 组和 phonenumber 有像 array(array('number' =>'123 112'), 数组('number' => '321 321'))
  • 我不确定这是否有任何后果,但您的类名拼写不正确(不区分大小写)另外:您是否尝试在 Phonenumber & Group-Data 中设置 foreignKey (user_id)?跨度>
  • 要明确:您想添加一个新用户并将其自动递增的 ID 用作 user_id 以保存电话号码和组?

标签: cakephp model save has-and-belongs-to-many


【解决方案1】:

考虑到 CakePHP 文档,您会发现以下提示:

在使用关联模型时,重要的是要意识到 保存模型数据应始终由相应的 CakePHP 完成 模型。如果您要保存新帖子及其相关评论,则 您将在保存操作期间同时使用 Post 和 Comment 模型 (http://book.cakephp.org/2.0/en/models/saving-your-data.html#saving-related-model-data-hasone-hasmany-belongsto)

根据这些信息,我建议您尝试以下方法:

$this->User->save($data);  // first save the user

假设您有多个数字:

foreach($numbers as $key => $nbr) {
    // set user_id related data
    $numbers[ $key ]['Phonenumber']['user_id'] = $this->User->id;
}

最后保存你的相关数据:

$this->User->Phonenumber->saveAll($numbers);

由于此代码未经测试您可能需要进行一些调整。始终确保遵循 Cake-Conventions 并使用 CamelCase ModelNames。

【讨论】:

  • 也许你的 Bug 在你的 JavaScript 中。
【解决方案2】:

FWIW saveAll() 应该像宣传的那样工作,一举将新的 user_id 填充到子表中。

您是否注意过相关选项:atomic & deep?

特别是如果数据库不支持事务,则需要传入 atomic:

$this->saveAll(array(
            'User' => $data, 
            'phonenumber' => $numbers, //array with data
            'group' => $groups //array with data
   ),
   array('atomic' => false)
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    • 2013-09-24
    • 1970-01-01
    • 1970-01-01
    • 2013-04-14
    • 2012-08-08
    相关资源
    最近更新 更多