7

无论如何让蛋糕在单个查询中执行多行插入而不编写原始 SQL 来执行此操作?saveMany 和 saveAssociated 选项只会在单个事务中保存多行,但该事务包含多个插入语句,因此这些方法显然不是编写繁重应用程序的解决方案。

谢谢阅读。

4

5 回答 5

3

是的

尽管在应用程序代码中这样做并不是一种常见的做法,并且这样做消除了使用几乎任何应用程序逻辑(验证规则、行为、事件等)的可能性。您可以看到一个以加载固定装置的方式执行此操作的示例:

$db = ConnectionManager::getDataSource('default');

$table = "stuffs";
$fields = array('id', 'name');
$values = array(
    array(1, 'one'),
    array(2, 'two'),
    ...
);

$result = $db->insertMulti($table, $fields, $values);

您可能还会发现此存储库很有用(直接或作为代码的基础),它使用多插入将夹具文件加载到您的应用程序数据库中。

于 2013-06-11T08:42:52.060 回答
2

是的,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;
于 2015-03-17T10:27:21.580 回答
0

有人将我指向大数据行为https://github.com/jmillerdesign/CakePHP_Big_Data

于 2013-06-14T21:50:07.073 回答
0

如果您使用的是 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));

来源:使用 CakePHP 3 插入多行

于 2015-07-13T14:26:34.200 回答
-1

是的,你可以像下面这样使用

getDataSource()方法在 CakePHP 2.x 中是静态的,因此您应该能够使用:

$db = ConnectionManager::getDataSource('default');
$db->rawQuery($some_sql);

在这里我发布方法来做。您必须SQL手动创建一些语句才能一次插入多行。

如果我能帮助你更多,请告诉我。

于 2013-06-11T03:54:23.017 回答