最近在批量插入数据的时候一直插入数据出错,经过查手册以及度娘,总结出两种方法:
第一种方法:
$model = new User();
foreach($data as $attributes)
{
$_model = clone $model;
$_model->setAttributes($attributes);
$_model->save();
}
第二种方法
$model = new User();
foreach($data as $attributes)
{
$model->isNewRecord = true;
$model->setAttributes($attributes);
$model->save() && $model->id=0;
}
第三种方法
/**
* class for sql batch insert
*/
class CDbBICommand extends CDbCommand{
/** @var CActiveRecord $class */
private $class;
/** @var string $insert_tpl */
private $insert_tpl = "insert into %s(%s) ";
/** @var string $value_tpl */
private $value_tpl = "(%s)";
/** @var string $query */
public $query;
/** @var CDbColumnSchema[] $columns */
private $columns;
/** @var boolean $fresh */
private $fresh;
/** @param CActiveRecord $class
* @param CDbConnection $db
*/
public function __construct($class,$db){
$this->class = $class;
$this->createtpl();
parent::_construct($db);
}
private function createtpl(){
$this->fresh = true;
$value_tpl = "";
$columns_string = "";
$this->columns = $this->class->getMetaData()->tableSchema->columns;
$counter = 0;
foreach($this->columns as $column){
/** @var CDbColumnSchema $column */
if($column->autoIncrement){
$value_tpl .= "0";
}else{
$value_tpl .= "\"%s\"";
}
$columns_string .= $column->name;
$counter ++;
if($counter != sizeof($this->columns)){
$columns_string .= ", ";
$value_tpl .= ", ";
}
}
$this->insert_tpl = sprintf($this->insert_tpl, $this->class->tableName(), $columns_string);
$this->value_tpl = sprintf($this->value_tpl, $value_tpl);
}
/**
* @param CActiveRecord $record
*/
public function add($record){
$values = array();
$i = 0;
foreach($this->columns as $column){
if($column->autoIncrement){
continue;
}
$values[$i] = $this->class->{$column->name};
$i ++;
}
if(!$this->fresh){
$this->query .= ",";
}else{
$this->query = "values";
}
$this->fresh = false;
$this->query .= vsprintf($this->value_tpl, $values);
return true;
}
public function execute(){
$this->setText($this->insert_tpl." ".$this->query);
return parent::execute();
}
}
使用方法是通过add方法逐个加入数据,然后调用execute执行。
模拟极限越野
模拟极限越野开着大巴在各种奇葩路况里送乘客。山路弯道多得让人
模拟火车
模拟火车让你当回真正的火车司机,得先学会看信号灯、操作控制杆
可口的披萨美味的披萨
可口的披萨美味的披萨带您体验经营一家披萨店的乐趣。游戏画风温
定制虚拟偶像最新版
定制虚拟偶像最新版是一款超级经典有趣的日本模拟装扮类型的手游
病娇模拟器手机版正版(yandere simulator)
病娇模拟器最新版手游是一款萌妹二次元模拟游戏,玩家在游戏中可