我有一个UserCategoryFollows表,该表具有与用户相关的user_id
和与类别相关的category_id
。
用户可以遵循任意数量的类别,但是我不想为相同的category_id
和user_id
插入多行。
例如,我不想在数据库中使用它:
user_id category_id
1 2
2 1
2 3
1 4
2 1 <---- Duplicate
1 2 <---- Duplicate
这是我可以在模型内部验证的东西,还是通过控制器完成的验证?
我目前正在播种:
public function run()
{
$catCount = App\Category::count();
$faker = \Faker\Factory::create();
$follows = [];
for ($i = 0; $i < 100; $i++) {
$user_id = App\User::all()->random()->id;
$category_id = $faker->numberBetween(1, $catCount);
$follow = [
'user_id' => $user_id,
'category_id' => $category_id
];
array_push($follows, $follow);
}
foreach ($follows as $follow) {
App\UserCategoryFollow::create($follow);
}
}
我可以更改数组以提取重复项,但是我认为如果可能的话,最好在模型上进行处理。
答案 0 :(得分:1)
最初,您希望将此行添加到您的迁移文件 (此步骤是可选,但最好实施以确保数据完整性)< / em>
$table->unique(['user_id', 'category_id']);
第二,根据您的user_id和类别ID使用 firstOrCreate 自动避免插入非唯一值
for ($i = 0; $i < 100; $i++) {
$user_id = App\User::all()->random()->id;
$category_id = $faker->numberBetween(1, $catCount);
App\UserCategoryFollow::firstOrCreate( ['user_id' => $user_id,'category_id' => $category_id]);
}