Laravel: уникальный внешний ключ для каждого внешнего ключа (user_id) - PullRequest
0 голосов
/ 12 мая 2019

У меня есть таблица 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);
        }

    }

Я мог бы изменить свой массив для удаления дубликатов, но я думаю, что было бы лучше обработать модель, если это возможно.

1 Ответ

1 голос
/ 12 мая 2019

Изначально вы хотите добавить эту строку в файл миграции (этот шаг необязательный , но лучше реализовать его для обеспечения целостности данных)

$table->unique(['user_id', 'category_id']);

Во-вторых, используйте firstOrCreate на основе вашего user_id и идентификатора категории, чтобы автоматически не вставлять неуникальные значения

    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]);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...