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_idUser::class 希望 Laravel 能够获取数组,并在关系中自动使用它,但不幸的是,这也不起作用,因为该列没有'不存在。

我怎样才能在工厂内专门完成这项工作?

【问题讨论】:

当你这样做时,你必须从字面上指定列,所以如果你有一个usersbelongsTo关系,那么你应该有一个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 定义的主要内容,如果未能解决你的问题,请参考以下文章

laravel 8中扩展模型的工厂

Laravel 8 基于类的模型工厂

Laravel 8:调用未定义的函数工厂()

laraver框架学习------工厂模型填充测试数据

工厂构建/创建新的belongs_to时违反Mysql外键约束

Laravel 8 出厂状态后创建