【问题标题】:Inserting Record into Database with CakePHP Results in Foreign Key Violation使用 CakePHP 将记录插入数据库导致外键冲突
【发布时间】:2014-04-05 19:12:07
【问题描述】:

我现在要使用 CakePHP(几天),但在使用外键插入记录时遇到问题。

基本概念,仓库。

我有一个 warehouses 表来保存所有可用的仓库,我有一个 warehouse_types 表来保存不同类型的仓库。 warehouse_types 表中已经有一些数据。

我有一个简单的添加视图(基于 CakePHP's Cookbook 中的博客示例),我让它显示数据库中不同类型的名称。

保存页面时出现数据库错误。

Error: SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`kvs`.`warehouses`, CONSTRAINT `warehouses_ibfk_1` FOREIGN KEY (`warehouse_type_id`) REFERENCES `warehouse_types` (`id`))

正在生成的 SQL 是:

SQL Query: INSERT INTO `kvs`.`warehouses` (`name`, `location`, `modified`, `created`) VALUES ('Name Text', 'Location Text', '2014-04-02 12:07:13', '2014-04-02 12:07:13') 

如果我在request->data对象中输出信息,说明它正在获取warehouseType_id的值。

array(
    'Warehouse' => array(
        'name' => 'Name Text',
        'location' => 'Location Text',
        'warehouseType_id' => '1'
    )
)

在这方面的任何帮助都会很棒!

我的数据库表如下:

CREATE TABLE `warehouses` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL,
  `location` varchar(255) DEFAULT NULL,
  `warehouse_type_id` int(10) unsigned NOT NULL,
  `created` datetime DEFAULT NULL,
  `modified` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `warehouse_type_id` (`warehouse_type_id`),
  CONSTRAINT `warehouses_ibfk_1` FOREIGN KEY (`warehouse_type_id`) REFERENCES `warehouse_types` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1;

CREATE TABLE `warehouse_types` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;

我的模型如下:

class Warehouse extends AppModel{
    public $belongsTo = 'WarehouseType';
}

class WarehouseType extends AppModel{

}

我的观点(add.ctp)如下:

<h1>Add Warehouse</h1>
<?php
echo $this->Form->create('Warehouse');
echo $this->Form->input('name');
echo $this->Form->input('location');
echo $this->Form->input('warehouseType_id');
echo $this->Form->end('Create Warehouse');
?>

最后,我的 WarehousesController 中的 add 方法:

public function add(){
        //Check Request to see if it is a Post
        if($this->request->is('post')){
            $this->Warehouse->create(); //Make a new Warehouse object
            debug($this->request->data);
            if($this->Warehouse->save($this->request->data)){ //Try and save Warehouse
                $this->Session->setFlash(__('Warehouse '.$this->request->data['Warehouse']['name'].' created'));
                return $this->redirect(array('action' => 'index')); //Redirect back to Warehouse list
            }
            $this->Session->setFlash(__('Unable to add Warehouse :('));
        }
        $this->set('warehouseTypes', $this->Warehouse->WarehouseType->find('list'));
    }

我在这里阅读了这个似乎最相关的答案,但我迷路了:CakePHP Can't insert record with foreign key error

还查看了他们关于保存的文档:http://book.cakephp.org/2.0/en/models/saving-your-data.html#saving-related-model-data-hasone-hasmany-belongsto

【问题讨论】:

    标签: php mysql database cakephp foreign-keys


    【解决方案1】:

    您的列名与 CakePHP 中使用的不同。将 CakePHP 更改为使用 warehouse_type_id。 (您的 CakePHP 代码使用的是warehouseType_id

    【讨论】:

    • 非常感谢!我以为我试过了,但它没有用!我已经更新了视图以使用它,它确实如此! echo $this-&gt;Form-&gt;input('warehouse_type_id');
    【解决方案2】:

    在您的视图文件上更改此项-

    添加仓库

    <?php
    echo $this->Form->create('Warehouse');
    echo $this->Form->input('name');
    echo $this->Form->input('location');
    echo $this->Form->input('warehouseTypes');
    echo $this->Form->end('Create Warehouse');
    ?>
    

    【讨论】:

    • 我刚刚尝试过,但没有成功。我得到了和以前一样的错误。
    • 如果您添加echo $this-&gt;Form-&gt;input('warehouseTypes');,那么您的调试结果如何?
    • 您已经接受了答案?你还有这个问题吗?
    • 另一种方法似乎可以解决它,但我也很好奇您的解决方案。似乎有几种方法可以做到这一点?我的调试输出是:array( 'Warehouse' =&gt; array( 'name' =&gt; 'Kevin', 'location' =&gt; 'The Open Road', 'warehouseTypes' =&gt; '1' ) )
    • 这就是您保存数据所需的全部,以warehouse_type_id 作为字段名称。就观点而言,一切都取决于你。但尽量坚持使用 Cakephp 文档...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-16
    • 2016-03-02
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多