我有一个 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);
}
}
我可以更改我的数组以剔除重复项,但我认为如果可能的话最好在模型上进行处理。
最初,您希望将此行添加到您的迁移文件(此步骤是可选,但最好实现它以确保数据完整性)
$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]);
}