Laravel种子数据填充器中使用关联Eloquent\Builder失败

3

我正在尝试使用以下方式填充我的数据库:

factory(App\User::class, 1)
    ->create()
    ->each(function($u) {
        $role = factory(App\Role::class)->create();
        $u->role()->save( $role );
    });

以下是我的模型工厂:

$factory->define(App\User::class, function (Faker\Generator $faker) {
    return [
        'name' => 'Jakub Kohout',
        'email' => 'test@gmail.com',
        'password' => bcrypt('Uchiha'),
        'role_id' => 1
    ];
});

$factory->define(App\Role::class, function (Faker\Generator $faker) {
    return [
        'role_name' => 'Admin',
    ];
});

但是我遇到了这个错误:
Undefined property: Illuminate\Database\Eloquent\Builder::$orders

我做错了什么?


我认为错误不会是由你发布的代码引起的。你是否得到了一个包含错误信息的堆栈跟踪? - Ben Harold
这肯定是因为当我删除App::user的工厂时,一切都正常。 - Jakub Kohout
相关性不等于因果关系。当您尝试在“Eloquent Builder”对象上访问“Eloquent Model”的属性时,通常会出现此类型的错误。 - Ben Harold
1个回答

4

不幸的是,each函数不能用于单个元素。您必须创建多个模型才能使用each函数:

factory(App\User::class, 2)->create()->each(function($u) {
    $role = factory(App\Role::class)->create();

    $u->role()->save( $role );
});

源代码

当只创建一个元素时,直接返回实例而不是集合。

这对您的情况应该有效:

$user = factory(App\User::class)->create();

$role = factory(App\Role::class)->create();

$user->role()->save( $role );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接