Y a-t-il de toute façon avoir un gâteau faire un insert à plusieurs lignes dans une seule requête sans écrire SQL cru pour le faire? Les options Savemany et SavAaisSociée n'augmenteront que plusieurs lignes dans une seule transaction, mais cette transaction contient plusieurs instructions d'insertion afin que ces méthodes ne soient clairement pas une solution pour écrire des applications lourdes. P>
Merci de la lecture. P>
5 Réponses :
Oui, vous pouvez utiliser comme ci-dessous
La méthode getdataSource () code> est statique dans CakePHP 2.x, vous devriez donc pouvoir utiliser: P>
$db = ConnectionManager::getDataSource('default');
$db->rawQuery($some_sql);
Je sais comment faire cela avec SQL traditionnel, je veux rester dans mon cadre. RAW SQL est le dernier recours. J'ai trouvé ceci: Github.com/jmillerdesign/cakephp_big_data
Bien que ce ne soit pas une pratique courante de le faire dans le code des applications, et cela supprime la possibilité d'utiliser presque toute logique d'application (règles de validation, comportements, événements, etc.). Vous pouvez voir un exemple de faire cela dans la voie Les appareils sont chargés : p>
$db = ConnectionManager::getDataSource('default'); $table = "stuffs"; $fields = array('id', 'name'); $values = array( array(1, 'one'), array(2, 'two'), ... ); $result = $db->insertMulti($table, $fields, $values);
Il semble que cela insère toujours une seule ligne à la fois enveloppé dans une seule transaction ...
Quelqu'un m'a pointé vers le Big Data Comportement https://github.com/jmillerdesign/cakephp_big_data < / p>
Prudent =). Ce comportement a une API (peut-être) pratique, mais écrit SQL cru. Si vos données ne sont pas simples, vous allez obtenir des erreurs SQL Syntaxe - il ne suffit que de base Valeur citant . On dirait également que cela ne vous permet pas de faire quoi que ce soit, sauf insert / mises à jour complètes de rangée. Si vous souhaitez l'utiliser de toute façon, je vous suggère de mettre à jour pour simplement appeler Insérermulti , les requêtes SQL brutes non évaluées sont un problème en attente de se produire.
Oui, Big_Data est une bonne idée d'insertion de gros. Mais comme Remarque AD7SIX, il utilise toujours une valeur de valeur de base et ne renvoie pas l'ID d'insertion. Et base sur vos idées, j'ai écrit un petit script à insérer en vrac dans une seule requête, à l'aide de CakePHP par défaut citant et de retour d'ID d'enregistrements insérés.
$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;
Si vous utilisez CakePHP 3.0, vous pouvez vérifier la réponse à cette question: Comment utiliser Insérer dans Query Builder Insérer plusieurs enregistrements? < / a> Si vous utilisez CakePHP 2, vous devrez utiliser Source: Insertion de plusieurs rangées avec CakePHP 3 P > p>