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".