CakePHP 和 HABTM 插入/保存不起作用

Posted

技术标签:

【中文标题】CakePHP 和 HABTM 插入/保存不起作用【英文标题】:CakePHP and HABTM insert/save doesn't work 【发布时间】:2012-12-08 13:06:01 【问题描述】:

我卡在 Cakephp 插入中,这就是我所拥有的

-订购HABTM地址

-地址模型

这是我在地址模型中的关联:

public $hasAndBelongsToMany = array(
    'Address' => array(
        'className' => 'Address',
        'joinTable' => 'address_customers',
        'foreignKey' => 'customer_id',
        'associationForeignKey' => 'address_id'  
    )
);

我想用一个新地址保存/插入一位新客户 所以,我认为下面的数组会起作用:

array(
'Customer' => array(
    'nom' => 'Khiami',
    'prenom' => 'TEST',
    'tel' => '0945454545',
    'ptel' => '',
    'commentaire' => '',
    'email' => '',
    'anniversaire' => array(
        'day' => '08',
        'month' => '12',
        'year' => '2012'
    ),
    'createdFrom' => 's'
),
'Address' => array(
    (int) 0 => array(
        'adresse' => 'ADDR TEST',
        'cp_id' => '1',
        'etage' => '',
        'residence' => '',
        'batiment' => '',
        'appartement' => '',
        'type' => 'l',
        'code_sonette' => '',
        'code_portail' => '',
        'code_batiment' => '',
        'code_asc' => ''
    )
)
)

唯一有效的是我先保存客户,然后使用下面的数组:

array(
(int) 0 => array(
    'Customer' => array(
        'customer_id' => '394'
    ),
    'Address' => array(
        'adresse' => 'ADDR TEST',
        'cp_id' => '1',
        'etage' => '',
        'residence' => '',
        'batiment' => '',
        'appartement' => '',
        'type' => 'l',
        'code_sonette' => '',
        'code_portail' => '',
        'code_batiment' => '',
        'code_asc' => ''
    )
)
)

但是,我仍然没有填写关联表!它只在地址表中添加一个条目。

【问题讨论】:

您使用的是save 还是saveAll ?? 只是为了遵循蛋糕的命名约定,'joinTable' => 'address_customers'不应该是'joinTable' => 'addresses_customers'吗? 我尝试使用 save() 和 saveAll() ...大部分时间 saveAll() 因为我可以保存另一个地址。 【参考方案1】:

是的,您应该在两者中都指定它:

地址模型:

public $hasAndBelongsToMany = array(
   'Customer' => array(
       'className' => 'Customer',
       'joinTable' => 'address_customers',
       'foreignKey' => 'address_id',
       'associationForeignKey' => 'customer_id'  
));

客户模型:

 public $hasAndBelongsToMany = array(
   'Address' => array(
      'className' => 'Address',
      'joinTable' => 'address_customers',
      'foreignKey' => 'customer_id',
      'associationForeignKey' => 'address_id'  
));

【讨论】:

【参考方案2】:

由于您在 HABTM 关系中指定了可连接点,我怀疑它是命名约定问题。

您是保存在 Address 还是 Customer 模型中?因为如果你从地址模型中调用它,我想应该已经有一个客户,在这种情况下你只需要设置:

$this->request->data['Customer']['Customer'] = $customer_id; 

并保存地址数据,它应该在表中创建HABTM关联。

【讨论】:

这件事,我必须同时创建一个客户和一个地址。所以我没有客户的身份证。但是在我的问题的第二部分(“唯一有效的东西 [...]”)我尝试过这种方式。 你可以先保存客户而不是使用:$customerID = $this->Customer->getInsertID(); 来获取 ID,然后像我说的那样保存地址。但我猜应该有一个更简单的方法,你是否也在Customer 模型中指定了关系? 是的,我做了什么,但它不起作用,并且关系在客户模型内部(有问题) 应该在两个模型中指定关系。在您的问题中,您说它在地址模型中。 否,关系在客户模型上,因为客户 HABTM 地址。我必须在地址模型中添加关系吗?

以上是关于CakePHP 和 HABTM 插入/保存不起作用的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使用 Cakephp 中的 saveAll 一次将所有相关记录插入到 HABTM 中?

CakePHP 2.5 habtm 不保存

CakePHP 保存 HABTM 数据

CakePHP HABTM 关系保存新的关联

CakePHP 在 HABTM 字段中保存数据

CakePHP - 保存 HABTM