【问题标题】:Laravel factories: get current user idLaravel 工厂:获取当前用户 id
【发布时间】:2019-12-28 15:16:21
【问题描述】:

我正在使用 laravel 工厂在我的数据库中生成一些假用户,但我不知道如何获取我当前正在生成的用户的用户 ID。 我想获取当前用户的 id,这样我就可以对其进行哈希处理并将其放入 slug 中。

这是我目前的代码:

$factory->define(User::class, function (Faker $faker) {
$name = $faker->name;
$email = $faker->unique()->safeEmail;
$date_of_birth = $faker->date();

return [
    'name' => $name,
    'email' => $email,
    'email_verified_at' => now(),
    'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
    'remember_token' => Str::random(10),
    'date_of_birth' => $date_of_birth,
    'slug' => (\App\User::class)->id //This is the part that doesn't work,
];
});

【问题讨论】:

标签: laravel factories


【解决方案1】:

另一种解决方法是将 slug 设置在工厂之外。

这意味着slug 需要可以为空。

迁移:

$table->string('slug')->nullable();

工厂:

$factory->define(User::class, function (Faker $faker) {
$user = [
    'name' => $faker->name,
    'email' => $faker->unique()->safeEmail,
    'email_verified_at' => now(),
    'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
    'remember_token' => Str::random(10),
];

return $user;
});

播种机:

$users = factory(User::class, 5)->create();

foreach($users as $user) {
    $user->slug = $user->id;
    $user->save();
}

更新:

Laravel 提供工厂回调 (See Docs)

因此,您无需在播种器中循环,只需链接 afterCreating() 方法即可:

$factory->define(App\User::class, function (Faker $faker) {
return [
    'name' => $faker->name,
    'email' => $faker->unique()->safeEmail,
    'email_verified_at' => now(),
    'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
    'remember_token' => Str::random(10),
];
})->afterCreating(\App\User::class, function (\App\User $user, Faker $faker) {
    $user->slug = $user->id;
    $user->save();
});

【讨论】:

    【解决方案2】:

    ID 仅在记录插入数据库后分配。所以在你的工厂里没有办法访问它。

    假设您不仅需要 slug 作为测试/播种的一部分,最好的方法是挂钩模型的 created 事件:

    class User extends Authenticatable
    {
        protected static function boot() {
            parent::boot();
    
            static::created(function ($user) {
                $user->update(['slug' => $user->id]);
            });
        }
    }
    

    【讨论】:

      【解决方案3】:

      如果您的 users.id 是自动递增的,如果您使用我在评论中给出的问题的答案,您可以获得相同的 ID,方法是使用静态变量并递增它。

      $factory->define(App\AliasCommand::class, function (Faker\Generator $faker) {
          $name = $faker->name;
          $email = $faker->unique()->safeEmail;
          $date_of_birth = $faker->date();
      
          static $id = 1;
      
          return [
              'name' => $name,
              'email' => $email,
              'email_verified_at' => now(),
              'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
              'remember_token' => Str::random(10),
              'date_of_birth' => $date_of_birth,
              'slug' => $id++,
          ];
      });
      

      未测试,但这是我前一阵子的做法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-04
        • 2014-12-07
        • 2015-05-12
        相关资源
        最近更新 更多