php - relacion - usando eloquent orm de forma interactiva con tinker
Inserción masiva en Laravel usando ORM elocuente (8)
¿Cómo podemos realizar inserciones de bases de datos masivas en Laravel utilizando Eloquent ORM?
Quiero lograr esto en Laravel: https://stackoverflow.com/a/10615821/600516 pero me aparece el siguiente error.
SQLSTATE [HY093]: número de parámetro inválido: parámetros mixtos nombrados y posicionales.
Así es como lo haces de manera más elocuente,
$allintests = [];
foreach($intersts as $item){ //$intersts array contains input data
$intestcat = new User_Category();
$intestcat->memberid = $item->memberid;
$intestcat->catid= $item->catid;
$allintests[] = $intestcat->attributesToArray();
}
User_Category::insert($allintests);
Lo busqué muchas veces, finalmente utilicé timestamps
personalizadas como a continuación:
$now = Carbon::now()->toDateTimeString();
Model::insert([
[''name''=>''Foo'', ''created_at''=>$now, ''updated_at''=>$now],
[''name''=>''Bar'', ''created_at''=>$now, ''updated_at''=>$now],
[''name''=>''Baz'', ''created_at''=>$now, ''updated_at''=>$now],
..................................
]);
O al usar Laravel''s Factories (creando 10 usuarios):
$users = factory(App/User::class, 10)->make()->toArray();
App/User::insert($users);
Para quien esté leyendo esto, echa un vistazo al método createMany()
.
/**
* Create a Collection of new instances of the related model.
*
* @param array $records
* @return /Illuminate/Database/Eloquent/Collection
*/
public function createMany(array $records)
{
$instances = $this->related->newCollection();
foreach ($records as $record) {
$instances->push($this->create($record));
}
return $instances;
}
Podemos actualizar la respuesta de GTF para actualizar las marcas de tiempo fácilmente
$data = array(
array(
''name''=>''Coder 1'', ''rep''=>''4096'',
''created_at''=>date(''Y-m-d H:i:s''),
''modified_at''=> date(''Y-m-d H:i:s'')
),
array(
''name''=>''Coder 2'', ''rep''=>''2048'',
''created_at''=>date(''Y-m-d H:i:s''),
''modified_at''=> date(''Y-m-d H:i:s'')
),
//...
);
Coder::insert($data);
Actualización: para simplificar la fecha en que podemos usar carbono como @Pedro Moreira sugirió
$now = Carbon::now(''utc'')->toDateTimeString();
$data = array(
array(
''name''=>''Coder 1'', ''rep''=>''4096'',
''created_at''=> $now,
''modified_at''=> $now
),
array(
''name''=>''Coder 2'', ''rep''=>''2048'',
''created_at''=> $now,
''modified_at''=> $now
),
//...
);
Coder::insert($data);
ACTUALIZACIÓN2: para laravel 5, use updated_at
lugar de modified_at
$now = Carbon::now(''utc'')->toDateTimeString();
$data = array(
array(
''name''=>''Coder 1'', ''rep''=>''4096'',
''created_at''=> $now,
''updated_at''=> $now
),
array(
''name''=>''Coder 2'', ''rep''=>''2048'',
''created_at''=> $now,
''updated_at''=> $now
),
//...
);
Coder::insert($data);
Solo puede usar Eloquent::insert()
.
Por ejemplo:
$data = array(
array(''name''=>''Coder 1'', ''rep''=>''4096''),
array(''name''=>''Coder 2'', ''rep''=>''2048''),
//...
);
Coder::insert($data);
Tal vez una forma más Laravel de resolver este problema sea utilizar una colección y colocarla en bucle insertándose con el modelo, aprovechando las marcas de tiempo.
<?php
use App/Continent;
use Illuminate/Database/Seeder;
class InitialSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
collect([
[''name'' => ''América''],
[''name'' => ''África''],
[''name'' => ''Europa''],
[''name'' => ''Asia''],
[''name'' => ''Oceanía''],
])->each(function ($item, $key) {
Continent::forceCreate($item);
});
}
}
EDITAR:
Lo siento por mi mala interpretación. Para la inserción masiva esto podría ayudar y tal vez con esto puede hacer buenas sembradoras y optimizarlas un poco.
<?php
use App/Continent;
use Carbon/Carbon;
use Illuminate/Database/Seeder;
class InitialSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
$timestamp = Carbon::now();
$password = bcrypt(''secret'');
$continents = [
[
''name'' => ''América''
''password'' => $password,
''created_at'' => $timestamp,
''updated_at'' => $timestamp,
],
[
''name'' => ''África''
''password'' => $password,
''created_at'' => $timestamp,
''updated_at'' => $timestamp,
],
[
''name'' => ''Europa''
''password'' => $password,
''created_at'' => $timestamp,
''updated_at'' => $timestamp,
],
[
''name'' => ''Asia''
''password'' => $password,
''created_at'' => $timestamp,
''updated_at'' => $timestamp,
],
[
''name'' => ''Oceanía''
''password'' => $password,
''created_at'' => $timestamp,
''updated_at'' => $timestamp,
],
];
Continent::insert($continents);
}
}
$start_date = date(''Y-m-d h:m:s'');
$end_date = date(''Y-m-d h:m:s'', strtotime($start_date . "+".$userSubscription[''duration'']." months") );
$user_subscription_array = array(
array(
''user_id'' => $request->input(''user_id''),
''user_subscription_plan_id'' => $request->input(''subscription_plan_id''),
''name'' => $userSubscription[''name''],
''description'' => $userSubscription[''description''],
''duration'' => $userSubscription[''duration''],
''start_datetime'' => $start_date,
''end_datetime'' => $end_date,
''amount'' => $userSubscription[''amount''],
''invoice_id'' => '''',
''transection_datetime'' => '''',
''created_by'' => ''1'',
''status_id'' => ''1'', ),
array(
''user_id'' => $request->input(''user_id''),
''user_subscription_plan_id'' => $request->input(''subscription_plan_id''),
''name'' => $userSubscription[''name''],
''description'' => $userSubscription[''description''],
''duration'' => $userSubscription[''duration''],
''start_datetime'' => $start_date,
''end_datetime'' => $end_date,
''amount'' => $userSubscription[''amount''],
''invoice_id'' => '''',
''transection_datetime'' => '''',
''created_by'' => ''1'',
''status_id'' => ''1'', )
);
dd(UserSubscription::insert($user_subscription_array));
UserSubscription
es el nombre de mi modelo. Esto devolverá "true" si insert successfully else "false".