Laravel 8 在模型工厂中定义 belongsToMany 定义
Posted
技术标签:
【中文标题】Laravel 8 在模型工厂中定义 belongsToMany 定义【英文标题】:Laravel 8 define belongsToMany definition in Model factory 【发布时间】:2021-11-26 03:00:28 【问题描述】:我正在尝试创建一个 Request
工厂,它将为使用所述工厂创建的每个 Request
实例分配多个随机用户。
在工厂中使用definition
方法我可以为Media
分配一个belongsTo
,但我不清楚如何为users
创建一个belongsToMany
。
这是我的Request
模特:
class Request extends Model
use HasFactory;
public function media()
return $this->belongsTo('App\Media');
public function users()
return $this->belongsToMany('App\User');
这是我现在拥有的工厂:
class RequestFactory extends Factory
protected $model = Request::class;
public function definition()
return [
// This is the belongsToMany relationship (that doesn't work) defined as users() in the Request model.
'users' => function()
return User::inRandomOrder()->random(random_int(1,5))->get()->pluck('id');
,
// This is the belongsTo relationship (that works)
'media_id' => function()
return Media::inRandomOrder()->first()->id;
];
除了 users
键之外,我还尝试了 user_id
和 User::class
希望 Laravel 能够获取数组,并在关系中自动使用它,但不幸的是,这也不起作用,因为该列没有'不存在。
我怎样才能在工厂内专门完成这项工作?
【问题讨论】:
当你这样做时,你必须从字面上指定列,所以如果你有一个users
belongsTo
关系,那么你应该有一个user_id
,对于media
,它应该是media_id
。
@matiaslauriti 我希望users
成为belongsToMany
,而不是belongsTo
。
对不起,我看错了。然后你不能在那里指定它,它只适用于列。你必须使用After creation。
你可以在你的测试中这样做,这在很多情况下更有意义。 Request::factory()->hasUsers(4)->hasMedia()->create();
这将创建一个具有 4 个 User
和 1 个 Media
关系的 Request
,使用这些模型的工厂方法。
我有,但我使用的是 UUID,无论出于何种原因,而不是使用现有模型,它似乎生成了不存在的随机 UUID,导致外键约束失败。
【参考方案1】:
我认为当你做一个belongToMany关系时,Request和User之间还有另一个表可以称为UserRequest,你不能像这样在Factory中指定它,但你可以创建一个after create函数来创建之间的链接用户和第三个表中的请求 您可以在文档中看到它。 https://laravel.com/docs/8.x/database-testing#factory-callbacks
您可以在您的工厂类中添加以下方法:
public function configure()
return $this->afterMaking(function (Request $request)
//
)->afterCreating(function (Request $request)
//
);
【讨论】:
以上是关于Laravel 8 在模型工厂中定义 belongsToMany 定义的主要内容,如果未能解决你的问题,请参考以下文章