📜  Laravel 8 Factory - 一对多(多态)关系 - PHP (1)

📅  最后修改于: 2023-12-03 15:17:11.907000             🧑  作者: Mango

Laravel 8 Factory - 一对多(多态)关系 - PHP

在 Laravel 中,Factory 可用于生成虚拟数据,以便在测试和数据库填充时使用。本文将介绍 Factory 如何处理一对多(多态)关系。

一对多(多态)关系

一对多关系表示一个模型与多个相关模型之间的关联关系,而多态关系则允许模型与多个其他模型具有多态关联关系。例如,一篇文章可以关联多个评论,同时每个评论也可以属于其他不同的模型,例如视频或图片。

在 Laravel 中,一个典型的多态关联包括三个表和三个模型:

  • 一个包含主模型的 id 和其他有关信息的表(例如 articles 表);
  • 一个包含子模型的 id 和其他有关信息的表(例如 comments 表);
  • 一个跟踪子模型与主模型之间多态关系的表(例如 commentables 表,它包含 comment_id,以及 commentable_idcommentable_type 字段)。
创建 Factory

在创建 Factory 之前,需要先创建 ArticleComment 模型(如果还不存在的话):

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Article extends Model
{
    use HasFactory;

    /**
     * Get the comments for the blog post.
     */
    public function comments()
    {
        return $this->morphMany(Comment::class, 'commentable');
    }
}

class Comment extends Model
{
    use HasFactory;

    /**
     * Get the owning commentable model.
     */
    public function commentable()
    {
        return $this->morphTo();
    }
}

然后,可以创建 CommentFactory

namespace Database\Factories;

use App\Models\Article;
use App\Models\Comment;
use Illuminate\Database\Eloquent\Factories\Factory;

class CommentFactory extends Factory
{
    protected $model = Comment::class;

    /**
     * Define the model's default state.
     *
     * @return array
     */
    public function definition()
    {
        return [
            'body' => $this->faker->paragraph,
            'commentable_type' => Article::class,
            'commentable_id' => Article::factory(),
        ];
    }
}
使用 Factory

要使用 CommentFactory 生成评论,并将它们关联到一个文章中,可以使用以下代码:

use App\Models\Article;
use App\Models\Comment;

$article = Article::factory()->create();
Comment::factory()->count(5)->create([
    'commentable_id' => $article,
]);

在这个例子中,CommentFactory 会生成五条评论,并将它们关联到 Article 模型中。要注意的是,commentable_id 实际上是一个 Article 模型实例,而不是一个数字。这是因为创建 Factory 时,为 commentable_id 指定了一个 Factory:

'commentable_id' => Article::factory(),

这意味着,当 $article 对象传递给 Comment 模型时,commentable_id 字段将自动设置为 $article->id

总结

Factory 是 Laravel 中一个非常有用的工具,可以轻松创建虚拟数据。通过理解 Factory 如何处理多态关联,可以更好地进行数据库填充和测试,在模型之间创建复杂的关联关系。