You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 11单元测试使用Eloquent工厂创建关联模型时触发BadMethodCallException错误

Laravel 11单元测试使用Eloquent工厂创建关联模型时触发BadMethodCallException错误

我帮你定位到问题的根源啦!你代码里的链式调用顺序出错了——create()方法应该放在所有工厂关联定义(比如has())的最后,而不是中间。

你当前的写法是先调用create()生成了Pulse模型实例,接着在模型实例上调用has()方法。但has()是工厂类的专属方法,不是模型实例的方法,这就导致Laravel内部错误地尝试调用工厂类不存在的getRelated()方法,最终抛出了这个异常。

修正后的代码

把create()移到整个链式调用的末尾,确保所有关联定义都在工厂实例上完成,最后再执行创建操作:

Pulse::factory()
    ->has(
        PulseAnswer::factory()
            ->count(1)
            ->has(
                PulseReply::factory()
                    ->count(1)
            )
    )
    ->create([
        'pulse_period_start_date' => '2021-01-01',
        'pulse_period_end_date' => '2021-01-31',
        'submitted_by_id' => $submitter,
        'reviewed_by_id' => $reviewer,
        'reviewed_at' => '2021-02-01'
    ]);

补充说明

Laravel Eloquent工厂的链式调用逻辑是:所有用于定义模型结构、关联关系的方法(比如has()、for()、state())都需要在工厂实例上调用,而create()/make()这类执行生成操作的方法,必须放在最后一步——因为它们会终止工厂的链式调用,直接返回实际的模型实例。

这样调整后,工厂就能正确识别你要创建的关联关系,自动生成Pulse、关联的PulseAnswer和PulseReply数据了。

备注:内容来源于stack exchange,提问作者Drew Gallagher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 08:58:02