Laravel:唯一的外键与另一个外键(user_id)

时间:2019-05-12 16:20:42

标签: laravel model

我有一个UserCategoryFollows表,该表具有与用户相关的user_id和与类别相关的category_id

用户可以遵循任意数量的类别,但是我不想为相同的category_iduser_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);
        }

    }

我可以更改数组以提取重复项,但是我认为如果可能的话,最好在模型上进行处理。

1 个答案:

答案 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]);
    }