在laravel - column中与模型工厂播种多对多关系不能为空错误

时间:2017-10-24 10:23:47

标签: php database laravel laravel-5 laravel-seeding

鉴于我有以下表格:

  • 用户
  • 问题
  • 标记
  • question_tag my pivot table with two fields: question_id & tag_id

这些是我的模特关系:

用户

public function questions()
{
    return $this->hasMany(Question::class);
}

问题

public function user()
{
    return $this->belongsTo(User::class);
}

public function tags()
{
    return $this->belongsToMany(Tag::class);
}

代码

public function questions()
{
    return $this->belongsToMany(Question::class);
}

我为每个模型正确设置了数据库模型工厂。

有了我的播种机,这就是我想要实现的目标:

  1. 种子10个虚拟用户
  2. 对于每个虚拟用户,种子10个虚拟问题
  3. 对于每个虚拟问题,将其与最多5个随机标记相关联
  4. 为实现上述三个目标,我编写了以下数据库播种器:

    // Seed dummy users
    factory(App\User::class, 10)->create()->each(function($user)
    {
        // With dummy questions
        $user->questions()->saveMany(factory(App\Question::class, 10)->make()->each(function($question)
        {
            // With dummy tags
            $question->tags()->sync(factory(App\Tag::class, 5)->make());
        }));
    });
    

    运行时,我收到以下错误:

      

    [Illuminate \ Database \ QueryException] SQLSTATE [23000]:完整性   约束违规:1048列'question_id'不能为空(SQL:i   插入question_tagquestion_idtag_id)值(,1))

         

    [PDOException] SQLSTATE [23000]:完整性约束违规:   1048列'question_id'不能为空

    如何通过数据库模型工厂创建记录,如何为数据透视表设定种子?

    对于我提出的另一个问题,这个问题是related - 但现在我得到了一个不同的错误。

2 个答案:

答案 0 :(得分:1)

我已经解决了这个问题:

<?php

use Illuminate\Database\Seeder;

class DummyDataSeeder extends Seeder
{
    public function run()
    {
        // Seed dummy tags
        factory(App\Tag::class, 10)->create();
        $tagIds = DB::table('tags')->pluck('id')->toArray();

        // Seed dummy users
        factory(App\User::class, 10)->create()->each(function($user) use($tagIds)
        {
            // With dummy questions
            $user->questions()->saveMany(factory(App\Question::class, 3)
            ->create(['user_id' => $user->id])->each(function($question) use($tagIds)
            {
                // With dummy tags
                $question->tags()->sync(array_random($tagIds, mt_rand(1, 5)));
            }));
        });
    }
}

也许有更好的方法来做到这一点;但这对我有用。

答案 1 :(得分:0)

使用saveMany方法时, 你应该将Eloquent模型实例设置为这样的参数。

target1