【问题标题】:cakePhp and a foreign key : i cannot write the foreign key in the viewcakePhp 和外键:我无法在视图中写入外键
【发布时间】:2023-04-07 20:18:01
【问题描述】:

我的外键字段有问题:我用MySQLWorkbench 创建了一个categories 表,它通过1:n 关系链接到另一个表:Articles。它似乎有效,因为在Articles 中,有一个categories_id "INT" 字段。

我烘焙了整个项目,一切正常,除了这个外键:我写的不是接收“数字”的输入来指定categories_id数字,而是一种空的“选择”( list) 不包含任何内容,因此我无法在我的数据库中为 categories_id 字段输入任何数字:

这是图片:

如果我尝试“强制”并添加“文章”(因此没有类别),则会出现此错误:

错误:SQLSTATE[23000]:完整性约束违规:1452 无法添加或更新子行:外键约束失败(ecommerce.articles,CONSTRAINT fk_articles_categories FOREIGN KEY (categories_id) REFERENCES @ 987654334@ (id) ON DELETE NO ACTION ON UPDATE NO ACTION)

这是我的 add.ctp 文件(它写成 input 用于 categories_id,所以我不知道要更改什么):

<div class="articles form">
<?php echo $this->Form->create('Article');?>
    <fieldset>
        <legend><?php echo __('Add Article'); ?></legend>
    <?php
        echo $this->Form->input('nom');
        echo $this->Form->input('prix');
        echo $this->Form->input('categories_id');
    ?>

感谢您的帮助


编辑:

这是我添加的内容:

class Article extends AppModel {

    var $belongsTo = array(
        'Category' => array(
            'className'    => 'Category',
            'foreignKey'    => 'category_id'
         )
    );
}

和:

class Category extends AppModel {

    var $hasMany = array(
        'Article' => array(
            'className'    => 'Article',
            'foreignKey'    => 'category_id'
         )
    );
}

在控制器中(add()):

public function add() {
        //$this->set('categories',$this->Article->Category->find('all'));
        //$c = $this->Article->Category->find('all', array("recursive"=>-1, 'fields'=>array('id', 'nom')));
        $c = $this->Article->Category->find('list');
        $this->set('cat', $c);

但在我看来,pr($cat) 返回一个空数组...

<?php
    echo $this->Form->input('nom');
    echo $this->Form->input('prix');
    echo $this->Form->input('category_id', array('option'=>$cat));
            pr($cat);
?>

【问题讨论】:

    标签: cakephp foreign-keys foreign-key-relationship


    【解决方案1】:

    这是因为命名约定。如果您的表被称为categories,那么articles 中的外键应该是category_id(单数)并且模型必须被称为Category。控制器应该将一个名为“$categories”(复数)的变量传递给视图

    $this-&gt;set('categories',$this-&gt;Article-&gt;Category-&gt;find('list'))

    并且视图中的输入必须是:

    echo $this-&gt;Form-&gt;input('category_id');

    别忘了修改模型中的外键

    希望这会有所帮助:)

    【讨论】:

    • "如果你的模型叫做 Categories" => 你的意思是Category(单数)或table而不是model
    • @pleasedontbelong:谢谢,我应该把这个放在哪里:$this-&gt;set('categories',$this-&gt;Article-&gt;Category-&gt;find('list'));?在ArticlesController > add ?它不起作用(因为在非对象上调用了“find”......)。还有什么想法吗?你能解释一下你为什么叫“查找列表”吗?再次感谢
    • 是的,它应该在 ArticlesController/add() 中。它不起作用,因为您需要在文章模型中的文章和类别之间 declare the relation,或者如果您愿意,您可以 load the model in the controller 或在 $uses attribute 中添加“类别”以加载该模型
    • 将变量传递给视图时,如果您将变量命名为“类别”而不是“猫”,蛋糕将自动填充选择。但是,如果您想从数组中手动​​创建选择,则需要将“选项”添加到输入中(视图中有错字)。您在选项中提供的数组应该是一个简单的“键值”数组,这就是为什么您应该使用 'find('list')' 而不是 'find('all')'。如果你仍然有问题,我的建议是generate the code using bake :) 祝你好运
    • 你的代码中有错字。你写了array('option'=&gt;$cat));,应该是array('options'=&gt;$cat));,我猜是这样
    猜你喜欢
    • 2017-07-05
    • 1970-01-01
    • 2013-07-03
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    • 2018-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多