2016-11-27 3 views
1

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

Для простых схем это просто бриз, чтобы он работал :). Тем не менее, я столкнулся с несколькими проблемами при работе со сложными схемами БД, которые включают внешние ключи и таблицы отношений:

  • один к одному
  • Один ко многим
  • Многие ко многим

... Как описано в ссылке: Laravel 5.1 foreign keys in model factory.

В этой теме, official documentation предлагает запустить семена баз данных, как это:

public function run() 
{ 
    factory(App\User::class, 50)->create()->each(function ($u) { 
     $u->posts()->save(factory(App\Post::class)->make()); 
    }); 
} 

... но есть одна проблема с этим решением: при работе с большим количеством таблиц БД и работает много семян (с многие отношения между ними), обычно используется , используя эту методологию для создания ненужных моделей. Например, если бы мы запускали PostsTableSeeder.php перед одним из приведенных выше примеров, все эти сообщения не были бы связаны с пользователями и никогда не использовались в тестах и ​​разработке ...

Так что поиск способ справиться с этой ситуацией, я придумал функциональное решение, которое работает для меня и избегает ненужного создания этих «сиротских» моделей ...

И я хотел поделиться им со всеми, так что это просто объясняется в ответ :).

ответ

8

Так вот мое решение:

Пример занимается:

  • Пользователи & Профили (для иллюстрации один к одному отношения)
  • пользователей & Сообщений (для иллюстрации От одного до многих отношений бедра)

    // ONE TO ONE relationship (with Users already created) 
    $factory->define(App\Profile::class, function (Faker\Generator $faker) { 
        return [ 
         'user_id' => $faker->unique()->numberBetween(1, App\User::count()), 
         // Rest of attributes... 
        ]; 
    }); 
    
    // ONE TO MANY relationship (with Users already created) 
    $factory->define(App\Posts::class, function (Faker\Generator $faker) { 
        $users = App\User::pluck('id')->toArray(); 
        return [ 
         'user_id' => $faker->randomElement($users), 
         // Rest of attributes... 
        ]; 
    }); 
    
+0

Я не думаю, что вы могли бы предложить лучший способ достичь того же для многих, чтобы Много отношений?У меня есть пользователи и случаи с таблицей User_Cases, чтобы решить многие для многих. Я пытаюсь написать фабрику, чтобы засеять мой дБ. – Kenilik

+1

Я получаю ** много для многих ** подход в сеялки, а не с заводами ... В вашей сеялке вам нужно просто получить обе модели (* Пользователи * и * Случаи *) и пропустить один из них, назначая другой (ы) в каждом случае. – andcl

0

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

$factory->define(App\Post::class, function (Faker\Generator $faker) { 
    $user = factory('App\Models\User')->create(['email' => '[email protected],]); 
    // do your relationships here (...) 
    return [ 
     'user_id' => $user->id, 
     'title' => $faker->sentence, 
     'body' => $faker->paragraph, 
     ]; 
    } 

И я увидел еще один пример с использованием анонимной функции

$factory->define(App\Post::class, function (Faker\Generator $faker) { 
    return [ 
     'user_id' => function() { 
      return factory(App\User::class)->create()->id; 
     }, 
     'title' => $faker->sentence, 
     'body' => $faker->paragraph, 
    ]; 
} 

Источник: https://laracasts.com/series/laravel-from-scratch-2017/episodes/22

 Смежные вопросы

  • Нет связанных вопросов^_^