我很难弄清楚如何在拉拉维尔7到拉拉维尔8的工厂进行折射。下面是L7的原始工厂,下面的L8版本是我尝试过的重构版本。我知道$factory->define是错的,这就是我被困的地方。
Laravel 7版本
<?php
/** @var \Illuminate\Database\Eloquent\Factory $factory */
use App\Login;
use Faker\Generator as Faker;
$factory->define(Login::class, function (Faker $faker) {
$randomDateTime = $faker->dateTimeBetween('-6 hours', 'now');
return [
'user_id' => factory(App\User::class),
'tenant_id' => factory(App\Tenant::class),
'created_at' => $randomDateTime,
'updated_at' => $randomDateTime,
];
});Laravel 8版本
<?php
namespace Database\Factories;
use App\Models\Login;
use App\Models\Tenant;
use App\Models\User;
use Faker\Generator as Faker;
$factory->define(Login::class, function (Faker $faker) {
$randomDateTime = $faker->dateTimeBetween('-6 hours', 'now');
return [
'user_id' => User::factory(),
'tenant_id' => Tenant::factory(),
'created_at' => $randomDateTime,
'updated_at' => $randomDateTime,
];
});发布于 2021-10-30 04:38:47
你在这里有两个选择:
使用旧工厂
如果您没有时间对工厂进行适当的重构,您仍然可以通过使用laravel/legacy-factories包来使用旧的Laravel 7工厂:
composer require laravel/legacy-factories改造工厂
拉威尔8家工厂现在是一流的。以前,您将调用$factory对象的定义方法,将类和闭包传递给它,该闭包将返回工厂定义,如下所示:
<?php
use App\User;
use Faker\Generator as Faker;
use Illuminate\Support\Str;
$factory->define(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',
'remember_token' => Str::random(10),
];
});在Laravel 8中,同样的内容如下所示,并放在database/factories/UserFactory.php中进行自动发现:
<?php
namespace Database\Factories;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;
class UserFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array
*/
public function definition()
{
return [
'name' => $this->faker->name(),
'email' => $this->faker->unique()->safeEmail(),
'email_verified_at' => now(),
'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi',
'remember_token' => Str::random(10),
];
}
}正如您所看到的,工厂现在是与Illuminate\Database\Eloquent\Factories\Factory类扩展的独立类。
此外,您需要在模型上使用Illuminate\Database\Eloquent\Factories\HasFactory特性,以允许为该模型发现工厂。一旦添加了这个特性,Laravel就需要一个名为Model的Factory类,在database/factories文件夹中以database/factories作为后缀。
您可以在数据库测试文档的定义模型工厂章节中阅读所有这些内容。
在你的特殊情况下
您发布的代码需要重构并放入database/factories/LoginFactory.php中。
namespace Database\Factories;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;
class LoginFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array
*/
public function definition()
{
$randomDateTime = $faker->dateTimeBetween('-6 hours', 'now');
return [
'user_id' => User::factory(),
'tenant_id' => Tenant::factory(),
'created_at' => $randomDateTime,
'updated_at' => $randomDateTime,
];
}
}然后,您需要在您的Login.php模型类中使用Login.php,当然,您也必须对User和Tenant模型做同样的操作,创建UserFactory.php和TenantFactory.php。
https://stackoverflow.com/questions/69776459
复制相似问题