Php 创建父项时创建模型(例如,创建用户时创建5篇文章)
如果一个用户有许多帖子,而一篇帖子属于该用户,那么很容易做到:Php 创建父项时创建模型(例如,创建用户时创建5篇文章),php,laravel,laravel-5,Php,Laravel,Laravel 5,如果一个用户有许多帖子,而一篇帖子属于该用户,那么很容易做到: $factory->define(App\Post::class, function ($faker) { return [ 'title' => $faker->title, 'content' => $faker->paragraph, 'user_id' => function () { // Creates
$factory->define(App\Post::class, function ($faker) {
return [
'title' => $faker->title,
'content' => $faker->paragraph,
'user_id' => function () {
// Creates a User for every Post
return factory(App\User::class)->create()->id;
}
];
});
我如何实现相反的目标?而是在创建用户时创建5篇文章,并将该文章与新创建的用户关联
~z~编辑
我使用的是laravel 5.2,我已经在模型中声明了我的模型关系,因此我现在有:
$user = factory(App\User::class)->create();
$posts = factory(App\Post::class, 3)->make();
$user->posts()->saveMany($posts);
// Great, now I have a User and 3 Posts associated with that user.
// However, now, I want let's say, 5 votes per post.
// I can't call $posts->votes(), so I iterate
foreach ($posts as $post) {
$votes = factory(App\Votes::class, 5)->make();
$post->votes()->saveMany($votes);
}
然后,任何其他与投票等的关系都将嵌套在foreach中
$factory->define(App\User::class, function ($faker) {
return [
'name' => $faker->name,
'email' => $faker->email
];
});
$factory->define(App\Post::class, function ($faker) {
return [
'title' => $faker->title,
'content' => $faker->paragraph
];
});
$user = factory(User::class)->create();
$post = factory(User::class)->create();
$user->posts()->associate($post)
在$posts
$posts = factory(App\Post::class, 3)->make();
$user->posts()->saveMany($posts);
$user->posts()->associate($post)
在$posts
$posts = factory(App\Post::class, 3)->make();
$user->posts()->saveMany($posts);
我会使用模型事件。在您的
AppServiceProvider
中,添加以下事件:
namespace App\Providers;
use App\User;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
User::created(function ($user) {
$posts = factory(App\Post::class, 3)->make();
$user->posts()->saveMany($posts);
});
Post::created(function ($post){
$votes = factory(App\Vote::class, 3)->make();
$post->votes()->saveMany($votes);
});
}
现在,您不必担心自动创建,而且,这也不应该是控制器逻辑的一部分。我将使用模型事件。在您的
AppServiceProvider
中,添加以下事件:
namespace App\Providers;
use App\User;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
User::created(function ($user) {
$posts = factory(App\Post::class, 3)->make();
$user->posts()->saveMany($posts);
});
Post::created(function ($post){
$votes = factory(App\Vote::class, 3)->make();
$post->votes()->saveMany($votes);
});
}
现在,您不必担心自动创建,而且,无论如何,这不应该是控制器逻辑的一部分。目前我正在做类似的事情,但我的问题是我有几个关系,所以它变得非常混乱。我有没有办法在ModelFactory中实现这一点,或者有没有一种很好的方法来嵌套这些东西?例如:一个组有#个用户,用户有#个帖子,帖子有#个评论,等等。不要将所有内容嵌套在一个查询中,而是使用我建议的方法。您可以为每个模型类型创建不同的方法,并使用
SaveMany
或save
方法与用户关联关系。即使是你提到的那个也很混乱,所以助理似乎不是一个函数,但我已经把我对你建议的理解放在了我问题的底部。这就是你想要的吗?谢谢你可以用save
来代替它。目前我正在做类似的事情——但我的问题是我有好几段感情,所以会变得很混乱。我有没有办法在ModelFactory中实现这一点,或者有没有一种很好的方法来嵌套这些东西?例如:一个组有#个用户,用户有#个帖子,帖子有#个评论,等等。不要将所有内容嵌套在一个查询中,而是使用我建议的方法。您可以为每个模型类型创建不同的方法,并使用SaveMany
或save
方法与用户关联关系。即使是你提到的那个也很混乱,所以助理似乎不是一个函数,但我已经把我对你建议的理解放在了我问题的底部。这就是你想要的吗?谢谢您可以使用save
来代替该选项。