usar usando tinker relacion muchos masiva interactiva forma crear con como asignacion php database laravel eloquent

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