0

各リストにリストIDが添付された不動産ウェブサイトを作成しています。csvファイルを解析しているCakePHPのシェルを介してスクリプトを実行しており、既存のリストを更新するか、存在しない場合は新しいリストを挿入する必要があります。

問題はDuplicate entry '###' for key "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';

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

コマンドラインから実行しているシェルは次のとおりです。

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";
        }
    }
}

idCakePHPは通常、データベースで使用されるフィールドであることが好きであることを理解しています$primaryKey = 'ListingID'が、モデルで設定しました。DBでListingIDを設定しようとしましAuto Incrementたが、うまくいきませんでした。

誰かアイデアはありますか?私は新鮮です。

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シェルスクリプトを実行しているときに同じエラーが発生し、最新のレコードのIDが列のサイズで許可されている最大値であることがわかりました(テーブルにid列に中整数を使用させた人)ので、auto_incrementはそうではありませんでした働く。より大きな数値を修正できるように列を変更しました。おそらく明らかなことですが、誰かを助けるかもしれません。

于 2013-08-30T22:51:56.643 に答える