2015-09-12 4 views
7

Я пытаюсь добавить отношение к модели фабрики, чтобы сделать некоторые базы данных высева следующим образом - обратите внимание, что я пытаюсь добавить 2 сообщения для каждого пользователяАддиционных Laravel Factory Model

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

Но его выбрасывая следующую ошибку

Argument 1 passed to Illuminate\Database\Eloquent\Relations\HasOneOrMany::s 
ave() must be an instance of Illuminate\Database\Eloquent\Model, instance 
of Illuminate\Database\Eloquent\Collection given 

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

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

* ОБНОВЛЕНО *

Есть ли способ, чтобы гнездиться модель завода 3-го уровня вложенности?

public function run() 
{ 
    factory(App\User::class, 50) 
     ->create() 
     ->each(function($u) { 
      $u->posts()->saveMany(factory(App\Post::class, 2) 
        ->make() 
        ->each(function($p){ 
          $p->comments()->save(factory(App\Comment::class)->make()); 
      })); 
    }); 
} 
+4

Модели имеют метод с saveMany(), который принимает объекты сбора. Попробуйте '$ u-> posts() -> saveMany (factory (App \ Post :: class, 2) -> make());'. Однако имейте в виду, что это все равно сгенерирует 2 вопроса сохранения в фоновом режиме, оно не будет сохраняться с одним запросом. –

+4

@ Yasen: работает метод saveMany(). Есть ли какой-либо способ развить модельный завод на 3-й уровень глубже? См. Обновленное сообщение о том, что я имею в виду. – adam78

+1

Вы нашли решение более 2 уровней гнездования? –

ответ

4

Попробуйте это. Он работал для меня:

factory(\App\Models\Auth\User::class, 300)->create()->each(function ($s) { 
        $s->spots()->saveMany(factory(\App\Models\Spots\Parking::class, 2)->create()->each(function ($u) { 
          $u->pricing()->save(factory(\App\Models\Payment\Pricing::class)->make()); 
        })); 
        $s->info()->save(factory(\App\Models\User\Data::class)->make()); 
      }); 
+0

Как вы передаете данные? Как идентификатор, который должен соответствовать? Спасибо – Notflip

+1

Его завод, обратите внимание на петли. Все в цикле будет связано с моделью. –

0

Для вложенных отношений третьего уровня, если вы хотите создать данные с соответствующими соответствующими внешними ключами, вы можете перебрать все результаты от создания сообщения, например, так:

factory(App\User::class, 50)->create()->each(function($u) { 
    $u->posts() 
     ->saveMany(factory(App\Post::class, 2)->make()) 
     ->each(function($p){ 
      $p->comments()->save(factory(App\Comment::class)->make()); 
     }); 
}); 
0

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

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

Вы проверили? Работает? –