0

我正在创建一个房地产网站,每个列表都附加了列表 ID。我正在通过 CakePHP 中的 shell 运行一个脚本,该脚本正在解析一个 csv 文件,并且应该更新任何已经存在的列表,或者如果不存在则插入一个新列表。

问题是我不断得到一个Duplicate entry '###' for key "PRIMARY'where ### 是 CSV 提供的列表 ID。此脚本正在从命令行运行。

这是我的表包含的较小版本:

CREATE TABLE `listings` (
  `ListingID` int(11) NOT NULL,
  `AccessibilityYN` varchar(50) DEFAULT NULL COMMENT 'AccessibilityYN',
  `BathsFull` int(6) DEFAULT NULL COMMENT 'BathsFull',
  `BathsPartial` int(6) DEFAULT NULL COMMENT 'BathsPartial',
  `BathsTotal` decimal(5,1) DEFAULT NULL COMMENT 'BathsTotal',
  `Beds` int(11) DEFAULT NULL COMMENT 'Beds',
  PRIMARY KEY (`ListingID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

这是我的列表模型(注意我有public $primaryKey = 'ListingID';

class Listing extends AppModel {
    public $name = 'Listing';
    public $primaryKey = 'ListingID'; 
    public $belongsTo = array(
        'Agent' => array(
            'className'    => 'Agent',
            'foreignKey'   => 'AgentID'
        )
    );
}

这是我通过命令行运行的 shell:

class MyShell extends AppShell {

    public $uses = array('Listing');

    public function update_imported_listings() {

       /***SOME CODE HERE TO GET THE $entry FROM THE CSV***/

        $this->Listing->ListingID = $entry['ListingID'];

        if(!$this->Listing->exists()){
            $this->Listing->create();
        }

        if($this->Listing->save($entry)){
          echo "Saved Listing";
        } else {
          echo "Listing Failed";
        }
    }
}

我知道 CakePHP 通常喜欢id作为数据库中使用的字段,但是我已经$primaryKey = 'ListingID'在我的模型中设置了。我尝试Auto Increment在数据库中将 ListingID 设置为,但这没有用。

有人有什么想法吗?我很新鲜。

4

3 回答 3

5

设置 ListingID 没有任何作用

这条线是你的问题:

$this->Listing->ListingID = $entry['ListingID'];.

无论您的实际主键字段在数据库中是什么,主键值始终使用Model->id属性指定。因此,将其更改为:

$this->Listing->id = $entry['ListingID'];

你不需要调用存在

不需要显式检查具有特定主键值的记录是否存在。save()如果传递给的数据数组包含 db 中存在的有效主键值,Cake 将自动更新和记录而不是创建新的。create()如果您save()在循环中使用,请确保在保存之前调用。

于 2013-03-26T14:58:18.580 回答
0

不要破坏 CakePHP 的约定,使用 'id' 字段作为主键。

http://book.cakephp.org/view/24/Model-and-Database-Conventions

于 2013-03-26T14:59:49.290 回答
0

我在运行 cakePHP shell 脚本时遇到了同样的错误,结果发现最新记录的 ID 处于列大小允许的最大值(谁制作表格的 id 列使用了中等 int),所以 auto_increment 不是在职的。更改了列以允许修复更大的数字。可能是显而易见的,但可能会帮助那里的人。

于 2013-08-30T22:51:56.643 回答