CakePHP:key“的重复输入;初级';对于shell脚本

CakePHP:key“的重复输入;初级';对于shell脚本,php,mysql,cakephp,cakephp-2.0,rets,Php,Mysql,Cakephp,Cakephp 2.0,Rets,我正在创建一个房地产网站,每个清单都附有清单ID。我正在通过CakePHP中的shell运行一个脚本,该脚本正在解析csv文件,并且应该更新任何已经存在的列表,或者插入一个新的列表(如果不存在) 问题是,我一直在为键“PRIMARY”获取一个重复条目“#####”其中####是CSV提供的列表ID。此脚本是从命令行运行的 以下是我的表格的较小版本: CREATE TABLE `listings` ( `ListingID` int(11) NOT NULL, `Accessibility

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

问题是,我一直在为键“PRIMARY”获取一个重复条目“#####”其中####是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';

下面是我通过命令行运行的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'
。我尝试在数据库中将ListingID设置为
自动增量
,但没有成功

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

设置列表ID什么都不做 这是你的问题:

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

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

$this->Listing->id = $entry['ListingID'];
你不需要打电话 无需显式检查是否存在具有特定主键值的记录。如果传递到
save()
的数据数组包含数据库中存在的有效主键值,则Cake将自动更新并记录,而不是创建新的记录。只需确保调用
create()
如果在循环中使用
save()
,则在保存之前。

设置ListingID不起任何作用 这是你的问题:

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

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

$this->Listing->id = $entry['ListingID'];
你不需要打电话
无需显式检查是否存在具有特定主键值的记录。如果传递到
save()
的数据数组包含数据库中存在的有效主键值,则Cake将自动更新并记录,而不是创建新的记录。只需确保调用
create()
在保存之前,如果在循环中使用
save()

不要打破CakePHP惯例,请使用“id”字段作为主键


不要打破CakePHP惯例,使用“id”字段作为主键


我在运行cakePHP shell脚本时遇到了相同的错误,结果发现最新记录的ID处于列大小允许的最大值(创建表的人使用了中间int作为ID列),因此自动增量不起作用。更改了列以允许修复更大的数字。这可能是显而易见的,但可能会对其他人有所帮助。

我在运行cakePHP shell脚本时遇到相同的错误,结果是最新记录的ID处于列大小允许的最大值(制作该表的人在id列中使用了中整数),因此自动增量不起作用。更改了列以允许修复较大的数字。可能是一些明显的问题,但可能会对其他人有所帮助。

但这样做的问题是,我得到了错误
列未找到:1054未知列'Listing.id'位于'where子句'
中,请确保正在加载模型文件。在troller放置了一个
调试(get_class($this->Listing))
,如果它返回“AppModel”而不是“Listing”,这意味着您可能错误地命名了您的模型文件,并且没有加载它。它返回的是
AppModel
。我是否使用
public$uses=array('Listing')在我的shell脚本中正确地调用了模型
?另外,我已经检查了一个我的模型文件
LisingModel.php
的名称是否正确。好吧,我是个白痴。它应该是Listing.php而不是ListingModel.php。这就是我整天从CakePHP跳到CodeIgniter的结果。谢谢;)您是否介意包括您关于检查模型文件命名是否正确的建议,以便我可以接受您的答案?这不是第一次有人犯这样的错误。我谴责模型文件的非直观命名约定。用户通常创建的大多数其他类类型在filename expect models中都有类类型后缀。问题是当我这样做的时候,我在where子句中得到错误
列notfound:1054 Unknown Column'Listing.id'
确保模型文件正在加载。如果它返回“AppModel”而不是“Listing”,则在控制器中放入
调试(get_class($this->Listing))
“这意味着您的模型文件可能命名不正确,并且没有加载。它正在返回
AppModel
。我是否在上面的shell脚本中使用
public$uses=array('Listing')调用模型时出错?此外,我还检查了一个我的模型文件
LisingModel.php
的名称是否正确。好吧,我是个白痴。它应该是Listing.php而不是ListingModel.php。这就是我整天从CakePHP跳到CodeIgniter的原因。谢谢;)你介意把你关于检查模型文件命名是否正确的建议包括在内吗?这样我就可以接受你的答案了。这已经不是第一次有人犯这样的错误了。我指责模型文件的非直观命名约定。用户通常创建的大多数其他类类型在filename expect models中都有类类型后缀。我通过更新模型中的主键解决了这个问题
$primaryKey='ListingID'
我通过更新模型中的主键解决了这个问题<代码>$primaryKey='ListingID'