侧边栏壁纸
  • 累计撰写 168 篇文章
  • 累计创建 71 个标签
  • 累计收到 35 条评论

目 录CONTENT

文章目录

laravel8更新之模型目录及模型工厂类调整

神兵小将
2020-10-13 / 0 评论 / 24 点赞 / 2,247 阅读 / 0 字 / 正在检测是否收录...

模型目录调整

不久前,泰勒·奥特威尔(Taylor Otwell)在Twitter上进行了一项民意调查,询问社区是否将所有模型都放在一个app/Models文件夹中或使用默认app/目录,并且大多数人表示他们将其模型放入app/Models。

由于该调查,app/Models默认情况下该文件夹现在将包含在Laravel 8中。

如果使用php artisan make:model User命令创建新模型,它将把新模型放在app/Models目录中。

注意:关于这一点的一个值得注意的事情是,如果您不喜欢该Models目录,只要删除该app/Models目录,该artisan命令将app/直接在目录中添加新模型,就像以前在所有Laravel版本中一样。

模型工厂类的调整

Eloquent的模型工厂已完全改写为基于类的工厂,并经过改进以提供一流的关系支持。例如,UserFactory,在Laravel中包含的内容是这样写的:

<?php

namespace Database\Factories;

use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;

class UserFactory extends Factory
{
    /**
     * The name of the factory's corresponding model.
     *
     * @var string
     */
    protected $model = User::class;

    /**
     * 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', // password
            'remember_token' => Str::random(10),
        ];
    }
}

由于HasFactory生成的模型具有新特性,因此可以直接在控制器中使用模型工厂,只需要use一下模型:

use App\Models\User;

User::factory()->count(50)->create();

由于模型工厂现在是简单的PHP类,因此状态转换可以写为类方法。另外,您可以根据需要将其他任何帮助程序类添加到Eloquent模型工厂中。

例如,您的User模型可能具有suspended修改其默认属性值之一的状态。您可以使用基本工厂的state方法定义状态转换。您可以根据自己的喜好命名状态方法。毕竟,这只是一个典型的PHP方法:

/**
 * Indicate that the user is suspended.
 *
 * @return \Illuminate\Database\Eloquent\Factories\Factory
 */
public function suspended()
{
    return $this->state([
        'account_status' => 'suspended',
    ]);
}

定义状态转换方法后,我们可以像这样使用它:

use App\Models\User;

User::factory()->count(5)->suspended()->create();

如前所述,Laravel 8的模型工厂包含对关系的一流支持。因此,假设我们的User模型有一个posts关联方法,我们可以简单地运行以下代码来生成一个包含三个帖子的用户:

$users = User::factory()
            ->hasPosts(3, [
                'published' => false,
            ])
            ->create();

为了简化升级过程,已发布了laravel/legacy-factories软件包,以支持Laravel 8.x中模型工厂的先前迭代。

Laravel重新编写的工厂包含许多我们认为您会喜欢的功能。要了解有关模型工厂的更多信息,请查阅数据库测试文档

关注我,每天更新文章。

24

评论区