📅  最后修改于: 2023-12-03 15:17:11.907000             🧑  作者: Mango
在 Laravel 中,Factory 可用于生成虚拟数据,以便在测试和数据库填充时使用。本文将介绍 Factory 如何处理一对多(多态)关系。
一对多关系表示一个模型与多个相关模型之间的关联关系,而多态关系则允许模型与多个其他模型具有多态关联关系。例如,一篇文章可以关联多个评论,同时每个评论也可以属于其他不同的模型,例如视频或图片。
在 Laravel 中,一个典型的多态关联包括三个表和三个模型:
id
和其他有关信息的表(例如 articles
表);id
和其他有关信息的表(例如 comments
表);commentables
表,它包含 comment_id
,以及 commentable_id
和 commentable_type
字段)。在创建 Factory 之前,需要先创建 Article
和 Comment
模型(如果还不存在的话):
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(),
];
}
}
要使用 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 如何处理多态关联,可以更好地进行数据库填充和测试,在模型之间创建复杂的关联关系。