Tak, Big_Data jest dobrym pomysłem na wstawianie luzem. Ale jak zauważa AD7six, nadal używa on podstawowej wartości i nie zwraca identyfikatorów insertów. Opierając się na twoich pomysłach, napisałem mały skrypt do wstawiania luzem w pojedynczym zapytaniu, używając domyślnego cytowania CakePHP i zwracania identyfikatorów wstawionych rekordów.
$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;
Ostrożnie =). Takie zachowanie ma (być może) poręczne API, ale IS pisze raw sql. Jeśli twoje dane nie są proste, dostaniesz błędy składni sql - robi to tylko podstawowe [cytowanie wartości] (https://github.com/jmillerdesign/CakePHP_Big_Data/blob/master/Model/Behavior/BigDataBehavior.php# L146). Wygląda na to, że nie pozwala ci nic zrobić poza wstawieniem/aktualizacją całego wiersza.Jeśli mimo wszystko chcesz go użyć, sugeruję aktualizację, aby po prostu zadzwonić pod numer [insertMulti] (https://github.com/cakephp/cakephp/blob/master/lib/Cake/Model/Datasource/DboSource.php#L2894). kwerendy sql są problemem czekającym na wystąpienie. – AD7six
Dzięki za komentarz. – systematical