Cakephp保存不保存关联模型

Cakephp保存不保存关联模型,php,cakephp,Php,Cakephp,我有两个表用户和客户 用户表结构如下所示: id (primary) username(varchar) password, client_id user_id, client_id(primary), is_new 现在,我的客户机表如下所示: id (primary) username(varchar) password, client_id user_id, client_id(primary), is_new 它们之间的关系定义如下: class User

我有两个表
用户
客户

用户表结构如下所示:

  id (primary)
  username(varchar)
password, client_id
user_id, client_id(primary), is_new
现在,我的客户机表如下所示:

  id (primary)
  username(varchar)
password, client_id
user_id, client_id(primary), is_new
它们之间的关系定义如下:

    class User extends AppModel
{
    public $name = 'User';
    public $hasOne = array(
        'Client' =>array(
            'className' => 'Client',
            'dependent' => true,
            'foreignKey' => 'client_id'
        )
    );
}


    class Client extends AppModel
{
    public $name = 'Client';
    public $primaryKey = 'client_id';
    public $belongsTo = array(
        'User' => array(
            'className' => 'User',
            'dependent' => true,
            'foreignKey' => 'user_id'
        )
    );
}
现在,在我的userscontroller中,我有以下保存操作:

      if ($this->request->is('post')) {
        $data = null;
        $client_id = null;
        if ($this->request->data['User']['group_id'] == 1) {
            $client_id = 2;

        } elseif ($this->request->data['User']['group_id'] == 2) {
            $client_id = $this->request->data['User']['Client id'];
        }
        $data = array('User' => array(
            'username' => $this->request->data['User']['username'],
            'password' => $this->request->data['User']['password'],
            'group_id' => $this->request->data['User']['group_id'],
            'client_id' => $client_id),
        'Client' => array('client_id' => $client_id)
        );

        if ($this->User->save($data)) {
            $this->Session->setFlash(__('The user has been saved'));
            $this->redirect(array('action' => 'index'));
        } else {
            $this->Session->setFlash(__('The user could not be saved. Please, try again.'));
        }
    }
    $groups = $this->User->Group->find('list');
    $this->set(compact('groups'));
}
当我保存一个新实体时,该实体将以正确的客户端id添加到用户表中,但没有添加任何内容到客户端表中

谁能告诉我为什么会这样

请注意,我已尝试将函数更改为
saveAll()

更新

如果我这样做:

        $data = array( 'User' => array( 'username' => $this->request->data['User']['username'],
                'password' => $this->request->data['User']['password'],
                'group_id' => $this->request->data['User']['group_id'],
                'client_id' => $client_id ),
                'Client' => array('client_id' => $client_id) );
            if ($this->User->Client->saveAll($data)) {
}
Aka使用
$this->User->Client->saveAll
而不是
$this->User->saveAll()

一切正常


现在这很好,但它是这样的吗?

使用
$this->User->saveAssociated($data)
而不是
$this->User->save($data)

更新

只需如下所示设置没有字段id的客户端数据,以便在保存用户时保存数据

$data = array(
    'User' => array(
        'username' => $this->request->data['User']['username'], 
        'password' => $this->request->data['User']['password']
    ), 
    'Client' => array(
        'field1' => 'field1value',
        'field2' => 'field2value',
        'field3' => 'field3value'
    )
);

是的,这两者是相同的,它们之间唯一的区别是当您需要立即保存关联模型时使用saveAssociated,而saveAll是saveAssociated的包装器

您可以使用saveAssociated

$this->User->saveAssociated($data)

以及saveAll()

$this->User->saveAll($data)


谢谢

为什么不使用
$this->User->save($this->request->data)
,而不是有效地将其复制到另一个变量?从代码的外观来看,最好将该代码放在模型函数中,这样控制器代码就是
$this->User->register($this->request->data)-胖型,瘦型controllers@AD7six我这样做的唯一原因是因为只有一种情况下我必须硬编码我的客户端id(它与我的程序的访问有关),这可以转换为我同意的模式,尽管
$this->request->data['client']['client\u id']=$foo
可以做到这一点-看起来只是有时候需要这么做,将是2行代码,而不是14行。它将作为well@Marc我的意思是,不要从
request->data
复制键来创建另一个变量,只需操纵
request->data
,并将其传递给model方法-如果它不起作用(以不同的方式),你没有这样做=)。如果我这样做,我会得到2013-09-19 11:43:52错误:[PDOException]SQLSTATE[23000]:完整性约束冲突:1062键“PRIMARY”的重复条目“0”意味着它找不到我的客户机\u我只需这样做,可能工作
$data=array('username'=>$this->request->data['User'['username'],'password'=>this->request->data['User']['password'],'group\u id'=>this->request->data['User']['group\u id'],'client\u id'=>client\u id],'client'=>array()
消除了sql错误,但没有向clients表中插入任何内容(也就是说,我们回到了起点),只需尝试像这样向您的客户机中插入一些内容即可<代码>$data=array('User'=>array('username'=>this->request->data['User']['username']、'password'=>this->data['User']['password']、'group\u id'=>data['User']['group\u id']、'client\u id'=>array('body'=>Comment 1'、'User\u id'=>1),数组('body'=>'同时保存一个新用户,'user'=>数组('first'=>'mad','last'=>'coder'),)
即使它不起作用,也肯定是您设置主键的问题,即
客户端id