无论如何让蛋糕在单个查询中执行多行插入而不编写原始 SQL 来执行此操作?saveMany 和 saveAssociated 选项只会在单个事务中保存多行,但该事务包含多个插入语句,因此这些方法显然不是编写繁重应用程序的解决方案。
谢谢阅读。
无论如何让蛋糕在单个查询中执行多行插入而不编写原始 SQL 来执行此操作?saveMany 和 saveAssociated 选项只会在单个事务中保存多行,但该事务包含多个插入语句,因此这些方法显然不是编写繁重应用程序的解决方案。
谢谢阅读。
尽管在应用程序代码中这样做并不是一种常见的做法,并且这样做消除了使用几乎任何应用程序逻辑(验证规则、行为、事件等)的可能性。您可以看到一个以加载固定装置的方式执行此操作的示例:
$db = ConnectionManager::getDataSource('default');
$table = "stuffs";
$fields = array('id', 'name');
$values = array(
array(1, 'one'),
array(2, 'two'),
...
);
$result = $db->insertMulti($table, $fields, $values);
您可能还会发现此存储库很有用(直接或作为代码的基础),它使用多插入将夹具文件加载到您的应用程序数据库中。
是的,Big_Data 是插入批量的好主意。但正如 AD7six 所指出的,它仍然使用基本值引用并且不返回插入 ID。并根据您的想法,我编写了小脚本以在单个查询中插入批量,使用默认的 CakePHP 引用和返回插入记录的 id。
$count = count($records);
$dbSource = $this->getDataSource();
$table = $dbSource->fullTableName($this->table);
$fields = $dbSource->prepareFields($this, array('fields' => array_keys($records[0])));
$values = array();
foreach ($records as $index => $record) {
if (!is_array($record) || !$record) {
return null;
}
foreach ($record as $column => $value) {
$values[$index][$column] = $dbSource->value($value, $this->getColumnType($column));
}
$values[$index] = '(' . implode(',', $values[$index]) . ')';
}
$query = 'INSERT INTO %s (%s) VALUES %s;';
$query = sprintf($query, $table, implode(',', $fields), implode(',', $values));
if (!$dbSource->execute($query)) {
return false;
}
$lastInsertId = $dbSource->getConnection()->lastInsertId();
$insertIds = array();
for ($i = 0; $i < $count; $i++) {
$insertIds[] = $lastInsertId + $i;
}
return $insertIds;
如果您使用的是 CakePHP 3.0,您可以查看这个问题的答案:How to use insert in query builder insert multiple records?
如果您使用的是 CakePHP 2,您将不得不像这样使用原始 SQL:
$sql = "INSERT INTO `people` (`name`,`title`) VALUES ";
foreach($people as $person){
list($name,$title) = $person;
$sql.= "('$name','$title'),";
}
$this->query(substr($sql,0,-1));
是的,你可以像下面这样使用
该getDataSource()
方法在 CakePHP 2.x 中是静态的,因此您应该能够使用:
$db = ConnectionManager::getDataSource('default');
$db->rawQuery($some_sql);
在这里我发布方法来做。您必须SQL
手动创建一些语句才能一次插入多行。
如果我能帮助你更多,请告诉我。