鉴于我有以下表格:
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);
}
我为每个模型正确设置了数据库模型工厂。
有了我的播种机,这就是我想要实现的目标:
为实现上述三个目标,我编写了以下数据库播种器:
// 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_tag
(question_id
,tag_id
)值(,1))[PDOException] SQLSTATE [23000]:完整性约束违规: 1048列'question_id'不能为空
如何通过数据库模型工厂创建记录,如何为数据透视表设定种子?
对于我提出的另一个问题,这个问题是related - 但现在我得到了一个不同的错误。
答案 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