0

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 を使用してこれを行う効率的な方法は何でしょうか。私はできる限りブルートフォースメソッドの使用を避けようとしています。

事前に感謝します。これについて何か助けていただければ幸いです。

ありがとう、マックス

4

1 に答える 1

1

モデルで一意の検証ルールを定義できます。次に、このルールに違反したときにキャッチし、条件付きブロックを使用して、重複する値が発生した場合にデータを処理します...

モデルルールでは

array('id', 'unique','message'=>'duplicate value entered'),

コントローラーで:

$this->brandModel->validate(); 
.......
.......

if ($this->brandModel->getError('id')==='duplicate value entered')
{
....
....
}
于 2013-10-03T13:07:28.350 に答える