Как заполнить таблицу базы данных сводки значениями фейкера в дополнительных полях Laravel? - PullRequest
0 голосов
/ 29 марта 2019

Я хочу заполнить свою базу данных более точными значениями.У меня есть 4 таблицы базы данных: Пользователь, Заказ, Продукты и Заказ_Продукты.Последняя таблица является сводной таблицей между заказом и продуктами.Я добавил два поля в эту сводную таблицу: сумма и цена.Теперь я хочу заполнить все эти таблицы фейкерными данными.Если я оставлю два дополнительных поля, это работает с кодом ниже.Если я добавлю два дополнительных поля в моей миграции.Я получаю ошибку (очевидно).Но как мне заполнить дополнительные поля из моей сводной таблицы?Заранее спасибо.

Он работал без дополнительных полей в моей сводной таблице, но знаю, что я хочу, чтобы дополнительное поле также было заполнено данными фейера.

Заводской заказ

$factory->define(App\Order::class, function (Faker $faker) {
    return [
        'orderdate' => now(),
        'amount' => $faker->randomFloat(2,0,6)
    ];
});

Заводской продукт

$factory->define(App\Product::class, function (Faker $faker) {
    return [
        'name' => $faker->name,
        'description' => $faker->sentence(),
        'price'=> $faker->randomFloat(2,0,6)
    ];
});

Сеялка

public function run()
{
   factory(App\User::class, 5)->create()->each(function ($user) {
            $user->orders()
                 ->saveMany(factory(App\Order::class, 2)
                 ->create(['user_id' => $user->id])
                 ->each(function ($order){
                      $order->products()
                      ->saveMany(factory(App\Product::class, 3)
                      ->create());
                      })
                      );
            });
}

Сводная таблица миграции

public function up()
{
    Schema::create('order_product', function (Blueprint $table) {
        $table->unsignedBigInteger('order_id');      
        $table->unsignedBigInteger('product_id');
        $table->integer('amount');
        $table->float('price',8,2);
    });

    Schema::table('order_product', function($table) {
        $table->foreign('product_id')->references('id')->on('products')->onDelete('cascade');
        $table->foreign('order_id')->references('id')->on('orders')->onDelete('cascade');
        $table->primary(['order_id', 'product_id']);
    });
}

1 Ответ

1 голос
/ 18 июня 2019

Попробуйте это

 public function run ()
 {
  factory ( App\User::class, 5 )->create ()
     ->each ( function ( $user ) {
        $user->orders ()->saveMany ( factory ( App\Order::class, 2 )->create ( [ 'user_id' => $user->id ] )
              ->each ( function ( $order ) {
                 $products = factory ( App\Product::class, 3 )->make ();
                 foreach ( $products as $product )
                 {
                    $order->products ()->attach ( $product->id, [ 'amount' => 'xxx', 'price' => 'xxx' ] );
                 }
              } )
           );
     } );

}

...