首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将龙舌兰7厂改装为8架

将龙舌兰7厂改装为8架
EN

Stack Overflow用户
提问于 2021-10-30 02:58:09
回答 1查看 435关注 0票数 4

我很难弄清楚如何在拉拉维尔7到拉拉维尔8的工厂进行折射。下面是L7的原始工厂,下面的L8版本是我尝试过的重构版本。我知道$factory->define是错的,这就是我被困的地方。

Laravel 7版本

代码语言:javascript
复制
<?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版本

代码语言:javascript
复制
<?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,
    ];
});
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-30 04:38:47

你在这里有两个选择:

使用旧工厂

如果您没有时间对工厂进行适当的重构,您仍然可以通过使用laravel/legacy-factories包来使用旧的Laravel 7工厂:

代码语言:javascript
复制
composer require laravel/legacy-factories

改造工厂

拉威尔8家工厂现在是一流的。以前,您将调用$factory对象的定义方法,将类和闭包传递给它,该闭包将返回工厂定义,如下所示:

代码语言:javascript
复制
<?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中进行自动发现:

代码语言:javascript
复制
<?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中。

代码语言:javascript
复制
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,当然,您也必须对UserTenant模型做同样的操作,创建UserFactory.phpTenantFactory.php

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69776459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档