219 votes

Insertion en masse dans Laravel à l'aide d'eloquent ORM

Comment effectuer des insertions de base de données en masse dans Laravel en utilisant Eloquent ORM ?

Je travaille avec un document XML, en parcourant ses éléments en boucle. Je veux accomplir quelque chose comme cela dans Laravel :

$sXML = download_page('http://remotepage.php&function=getItems&count=100&page=1');
$oXML = new SimpleXMLElement($sXML);
$query = "INSERT INTO tbl_item (first_name, last_name, date_added) VALUES";
foreach($oXML->results->item->item as $oEntry){
    $query .=  "('" . $oEntry->firstname . "', '" . $oEntry->lastname . "', '" . date("Y-m-d H:i:s") . "'),";
}
mysql_query($query);

mais j'obtiens l'erreur suivante.

SQLSTATE [HY093] : Invalid parameter number : mixed named and positional parameters.

1 votes

Avez-vous un has_many relation sur vos modèles ?

1 votes

Non, je n'ai pas de relations en ce moment.

0 votes

@DavidBarker J'ai essayé de former la chaîne de questions en utilisant une boucle for. J'ai également essayé d'utiliser les transactions dans Laravel.

-4voto

justnajm Points 557

Pour l'insertion des relations de catégorie, j'ai rencontré le même problème et je n'avais aucune idée, sauf que dans mon modèle éloquent, j'ai utilisé Self() pour avoir une instance de la même classe dans foreach pour enregistrer plusieurs sauvegardes et saisir les ids.

foreach($arCategories as $v)
{                
    if($v>0){
        $obj = new Self(); // this is to have new instance of own
        $obj->page_id = $page_id;
        $obj->category_id = $v;
        $obj->save();
    }
}

sans "$obj = new Self()" il n'enregistre qu'un seul enregistrement (quand $obj était $this)

-6voto

Problème résolu... Modifier une table pour migrer

$table->timestamp('created_at')->nullable()->useCurrent();

Solution :

Schema::create('spider_news', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->string('source')->nullable();
    $table->string('title')->nullable();
    $table->string('description')->nullable();
    $table->string('daterss')->nullable();

    $table->timestamp('created_at')->useCurrent();
    $table->timestamp('updated_at')->useCurrent();
});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X