在单个查询中保存多行

时间:2013-06-11 02:14:59

标签: cakephp

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

感谢阅读。

5 个答案:

答案 0 :(得分:3)

虽然在app-land代码中执行此操作并不常见,但这样做会消除使用几乎所有应用程序逻辑(验证规则,行为,事件等)的可能性。您可以通过fixtures are loaded

的方式查看此示例
$db = ConnectionManager::getDataSource('default');

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

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

您可能还会发现this repository有用(直接或作为您的代码的基础),它会将灯具文件加载到您的应用数据库中 - 使用多次插入。

答案 1 :(得分: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;

答案 2 :(得分:0)

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

答案 3 :(得分: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));

来源:Inserting Multiple Rows with CakePHP 3

答案 4 :(得分:-1)

是的,你可以使用如下

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

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

这里我发帖做的方法。您必须手动创建一些SQL语句以一次插入多行。

如果我能为您提供更多帮助,请告诉我。