HABTM 关联未保存 - cakephp

Posted

技术标签:

【中文标题】HABTM 关联未保存 - cakephp【英文标题】:HABTM association not saved - cakephp 【发布时间】:2013-12-05 14:02:27 【问题描述】:

我一直在寻找所有类型的解决方案,但都不起作用。我在 bredbook.php 和 Genre.php 中有两个模型,Bredbook 和 Genre,与 HABTM 相关联。无法保存关联。

这是一个模型的代码:

public $hasAndBelongsToMany = array('Bredbook' => array('className' => 'Bredbook',
'joinTable' => 'bredbooks_genres',
'foreignKey' => 'genre_id',
'associationForeignKey' => 'bredbook_id'));

这是表格:

echo $this->Form->create('Bredbook', array('action' => 'firstConnection'));
echo $this->Form->input('Genre', array('options' => $genres, 'empty' => false));
echo $this->Form->end('Validate');

在 BredbooksController.php 中:

if ($this->request->data)

    if($this->Bredbook->saveAssociated($this->request->data))
        return $this->redirect('/bredbooks/index');

bredbook 的创建没问题,但是表 bredbooks_genres 中没有创建关联。我已经尝试了一切...欢迎任何帮助。

【问题讨论】:

在保存前添加一个 debug($this->request->data) 并让我们知道结果 对不起,我写了这一行,我已经将调试设置为2,但我不知道应该打印在哪里...... 没关系,我愚蠢地保留了重定向...这是数组:array('Bredbook' => array('Genre' => '3')) 基于book.cakephp.org/2.0/en/models/…,我认为你的数组应该是这样的:array('Bredbook' => array(), 'Genre' => array('id' => 3)),但我并不肯定。 在这里发布调试后我也尝试过。我只尝试了流派 id、整个对象和不同级别(与“Bredbook”相同、“Bredbook”内部等)。我也在尝试几个功能(save、saveAssociated...),因为我不知道我需要使用哪一个...我已经卡了好几天了。 【参考方案1】:

您需要在数据数组中发送Bredbook.id

<?php
echo $this->Form->create('Bredbook');
//It can be any other attribute, but need some Breedbook data
echo $this->Form->input('Bredbook.id', array('value' => $id));
echo $this->Form->input(
    'Genre', 
     array(
        'options' =>$genres, 
        'empty' => false
    )
);
echo $this->Form->end('Validate');

或者在保存之前确保您的$this-&gt;request-&gt;data 与此类似:

Array
(
    [Bredbook] => Array
    (
         //It can be any other attribute, but need some Breedbook data
        [id] => 1
    )

    [Genre] => Array
    (
        [Genre] => Array
        (
             [0] => 1
        )

    )
)

当您创建新的Bredbook 时,此解决方案也可以工作,只要您发送该模型的一些数据,它不需要是id,您也可以发送名称或其他属性你的Bredbook 模特。如果您发送Bredbook.id,它不会创建新记录,只会进行关联,但如果您不发送id 并发送其他属性(例如name),它将创建一个新记录并将将其与您正在发送的Genre 数据相关联。

【讨论】:

array( 'Bredbook' =&gt; array( 'Genre' =&gt; '3' ), 'Genre' =&gt; array( 'Genre' =&gt; array( (int) 0 =&gt; '3' ) ) ),它也不起作用。我尝试了一切,没有创建关联 您需要将 brebook 模型的一个属性放入 breebok 数组中才能使其工作。你能粘贴一下你的面包簿表是什么样子的吗? 哦,对不起,我愿意。只是我只粘贴了与流派相关的字段,但我输入了其他信息。我有那个:array( 'Bredbook' =&gt; array( 'Genre' =&gt; '3', 'name' =&gt; 'New name', etc... ), 'Genre' =&gt; array( 'Genre' =&gt; array( (int) 0 =&gt; '3' ) ) )。我想知道问题是否可能出在其他地方。我有 3 个具有正确外键的表,我有两个模型......我应该有一个关联表的模型吗?我应该有一些特殊的领域吗? 您是否尝试过不使用'Genre' 键发送数据?像这样array( 'Bredbook' =&gt; array( 'name' =&gt; 'New name', etc... ), 'Genre' =&gt; array( 'Genre' =&gt; array( (int) 0 =&gt; '3' ) ) ) 我认为应该这样做。你只需要两个模型,第三个就是连接表。 我会尽快尝试,但目前我什至无法访问 localhost/xampp... 我尝试在不删除 cakephp 项目的情况下测试其他框架,但现在它没有不再工作了。如果我最终成功了,我会告诉你的【参考方案2】:

我终于做到了:不知道是不是必要的东西,但我只是用蛋糕烘焙来生成一切:http://book.cakephp.org/2.0/en/console-and-shells/code-generation-with-bake.html

现在我需要做一些工作来重新排列所有视图,但我的节省正在发挥作用,使用我首先发布的完全相同的代码,而且我想我也节省了一些时间来处理我需要的所有生成行为!

【讨论】:

以上是关于HABTM 关联未保存 - cakephp的主要内容,如果未能解决你的问题,请参考以下文章

Rails HABTM 关联:记录未插入连接表

尝试在保存时保存 CakePHP HABTM 关系中的重复关联

如何将数据写入 CakePHP 中 HABTM 连接表的 HABTM 关联?

CakePHP 保存 HABTM 数据

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

如何在不删除项目本身的情况下删除单个 HABTM 关联项目?