【问题标题】:Field doesn't have default value upon factory seeding against a one to many relationship针对一对多关系进行工厂播种时,字段没有默认值
【发布时间】:2018-09-27 21:16:22
【问题描述】:

我有一个speciality,可以有多个procedures

我想通过许多程序来播种这两个专业。

型号:

专业

class Speciality extends Model
{

    protected $fillable = ['name'];

    public function procedures() {
        return $this->hasMany('App\Procedure');
    }
}

程序

class Procedure extends Model
{
    protected $fillable = ['speciality_id', 'name'];

    public function speciality() {
        return $this->belongsTo('App\Speciality');
    }
}

工厂:

专业

$factory->define(App\Speciality::class, function (Faker $faker) {
    return [
        'name' => 'Example'
    ];
});

程序

$factory->define(App\Procedure::class, function (Faker $faker) {
    return [
        'name' => $faker->realText(20)
    ];
});

播种:

public function run()
    {
        factory(App\Speciality::class)->create()
            ->each(function($speciality) {
                $speciality->procedures()
                    ->saveMany(factory(App\Procedure::class, rand(5,20))
                    ->make()
                );
        });
    }

显示的错误是:

SQLSTATE[HY000]:一般错误:1364 字段“speciality_id”没有 有一个默认值(SQL:插入proceduresnameupdated_atcreated_at) 值(这意味着很多。,2018-04-17 2018-04-17 19:09:31 19:09:31))

speciality_id 没有设置为 procedure 工厂中的值,因为它是该专业的外键。但我对使用$speciality->procedures() 的理解是它会在播种时自动分配speciality_id。

请问为什么会出现这个错误。非常感谢。

【问题讨论】:

  • 不使用过程工厂检查 ->saveMany([ new Procedure(['name' => 'A new name']) ]);
  • 如果可行,则问题出在您的工厂
  • 您在代码中显示的模型是相同的还是简化的?
  • 他们是同一个@Kyslik。
  • 您的代码对我有用。尝试调试HasOneOrMany::setForeignAttributesForCreate()

标签: laravel laravel-5 laravel-seeding


【解决方案1】:

我在这里可能错了,但我认为你打电话给make时只是一个小问题:

public function run()
    {
        factory(App\Speciality::class)->create()
            ->each(function($speciality) {
                $speciality->procedures()
                    ->saveMany(factory(App\Procedure::class, rand(5,20))->make());     

        });
    }

虽然之前从未将它与saveMany() 一起使用,只是save(),但试试看?

【讨论】:

  • 感谢您的回复。它在 ->saveMany 行 - Call to a member function make() on integer 上引发错误。看起来->make() 应该在括号之外?如果是,错误会再次出现。
  • @Ben 你用的是什么版本?
  • 最新 5.6。我必须继续输入才能提交评论!
  • @JoshRum但是我以为OP中有错字,但实际上是正确的。
  • @Ben 我搞砸了括号,我现在在我的应用程序中为我工作,试试看
猜你喜欢
  • 1970-01-01
  • 2017-11-24
  • 1970-01-01
  • 1970-01-01
  • 2015-12-23
  • 2013-06-26
  • 2019-11-17
  • 2018-03-27
  • 2017-12-29
相关资源
最近更新 更多