Yii の AR モデルを使用してテーブルにデータを挿入しようとしています。Yii の AR での MySQL の ON DUPLICATE KEY UPDATE コマンドと同等の方法は何だろうと思っていました。巨大な xml フィードからデータを挿入するメソッド サンプルを次に示します。
public function insertData($name, $category, $brand, $price_unit, $weight_unit, $providers, $review_text, $flavor, $imageurl) {
$this->productModel = new Products;
$this->brandModel = new Brand;
$this->brandModel->name = $brand;
$this->brandModel->save();
$this->productModel->name = $name;
$this->productModel->category = $category;
$this->productModel->brand = $brand;
$this->productModel->weight_unit = $weight_unit;
$this->productModel->price_unit = $price_unit;
$this->productModel->flavors = $flavor;
$this->productModel->providers = $providers;
$this->productModel->review_text = $review_text;
$this->productModel->image_path = $imageurl;
$this->productModel->save();
}
ご覧のとおり、save() を使用して単純な挿入を行っています。しかし、mysqlのON DUPLICATE KEYコマンドを実装したいと思います。
問題のテーブルは次のとおりです。
+-------------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(100) | YES | MUL | NULL | |
| category | varchar(50) | YES | MUL | NULL | |
| brand | varchar(50) | NO | MUL | NULL | |
| weight | decimal(10,2) | YES | | NULL | |
| weight_unit | varchar(30) | YES | | NULL | |
| price | decimal(15,2) | YES | | NULL | |
| price_unit | varchar(30) | YES | | NULL | |
| flavors | varchar(45) | YES | | NULL | |
| providers | varchar(45) | YES | MUL | NULL | |
| review_text | text | YES | | NULL | |
| image_path | varchar(100) | YES | | NULL | |
+-------------+---------------+------+-----+---------+----------------+
したがって、ここでは id が主キーであり、name には検索を高速化するためのインデックスが設定されています。カテゴリとブランドは外部キーです。
Yii の ar を使用して複製したいクエリは次のようになります::
INSERT INTO tbl_products (name, category, brand, weight_unit, price_unit, flavors, providers, review_text, image_path) values ('.$this->parseXML[0] .', '.
$this->parseXML[1] .','
.$this->parseXML[2] .','
. $this->parseXML[3] .','
. $this->parseXML[4] .','
. $this->parseXML[5] .','
.$this->parseXML[6] .','
.$this->parseXML[7] .','
.$this->parseXML[8].')
ON DUPLICATE KEY UPDATE
name = '.$this->parseXML[1].',
category = '.$this->parseXML[2].',
brand = '.$this->parseXML[3].'
では、Yii の AR を使用してこれを行う効率的な方法は何でしょうか。私はできる限りブルートフォースメソッドの使用を避けようとしています。
事前に感謝します。これについて何か助けていただければ幸いです。
ありがとう、マックス