Voila je voudrais sauvegarder plusieurs records (+100) en un seule traitement, soit dans une même requête SQL (pour les performances).

Je me suis tourné vers la requête saveMany() de cake avec son "Atomic" système.

D'après la docs, il suffit de passer un tableau indexer numériquement.

Seuls soucis, l'enregistrement se fait correctement, MAIS en plusieurs insert to, si j'ai 100 records il me fait 100 requêtes.
Pas très performant tout ça :)

Voici un exemple array :

Array
(
    [0] => Array
        (
            [Answer] => Array
                (
                    [query_id] => 1
                    [user_id] => 300
                    [reply] => 1
                )
        )
    [1] => Array
        (
            [Answer] => Array
                (
                    [query_id] => 1
                    [user_id] => 500
                    [reply] => 0
                )
        )
)

$answers_list = array(
                        array('Answer' => array('query_id' => '1', 'user_id' => 300, 'reply' => 1)),
                        array('Answer' => array('query_id' => '1', 'user_id' => 500, 'reply' => 0)));
$this->Answer->saveMany($answers_list, array( 'fieldList' => array('query_id','user_id', 'reply')));

Résultat Mysql :

INSERT INTO `answers` (`query_id`, `user_id`, `reply`, `created`) VALUES (1, 300, 1, '2011-12-30 20:44:37')
INSERT INTO `answers` (`query_id`, `user_id`, `reply`, `created`) VALUES (1, 500, 0, '2011-12-30 20:44:37')

Pas super génial :s

Si vous avez une idée MERCI

Voici ce que dis la docs :

La docs !
ICI le code de API

2 réponses


extrarox
Réponse acceptée

Salut,

En lisant bien et en regardant le code de l'API, on se rend compte qui ne simplifie pas ta requête, mais qu'il lance une transaction.

Par défaut une base de données va effectuer chaque requête puis enregistrer le résultat sur le disque dur. (pour 100 requêtes => 100 sauvegardes)
Un transaction permet de faire toutes les requêtes, puis quand on commit la transaction, il y a sauvegarde dans le disque dur. (pour 100 requêtes => 1 sauvegarde)
Or ces étapes tu le vois bien dans le code API :

if ($options'atomic']) {
    $db = $this->getDataSource();
    $transactionBegun = $db->begin($this);
}
...
if (!$options'atomic']) {
    return $return;
}
if ($validates) {
    if ($transactionBegun) {
        return $db->commit($this) !== false;
    } else {
        return true;
    }
}

Donc il y a bien un gain de ressources.

A+

zaarkan
Auteur

Merci, je ne connaissais pas ce système de transaction. Je pense que je vais généré ma propre requête SQL et comparez les performances entre une transaction et ma requête perso. Il y'a de grand de chance que j'enregistre de grosse quantité de records, +100 voir +1000 dans certain cas. Je vais tester @ plus tard :).