Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Есть таблица articles (id, title, content,........) и таблица invoices (id, article_id,email,price,......)
Как сделать уникальную связку между article_id и email в таблице invoices ? Смысл в том, что бы один пользователь мог добавить только одну заявку на один article. То бишь пользователь с мылом example@mail.com мог кинуть заявку на article 1, 2, 3, 4, только по одному разу на каждый !? Спасибо
Не в сети
Может просто проверкой обойтись?
Не в сети
Нет, не вариант. Есть идеи какие-нибудь
Изменено MeKree (08.03.2017 17:05:36)
Не в сети
не вижу в invoices поля user_id. вообще получается что пользователи и articles связаны отношениями многие-ко-многим, а invoices - пивот-таблица с набором доп. свойств и полями article_id, user_id, ... очевидно что если на связи индекс по [user_id, article_id] объявить как уникальный, то на уровне СУБД добавляемые связи пользователей на статьи будут проверяться на уникальность и попытка добавления связи которая уже существует будет вызывать \PDOException. больше похоже на то что нужно? в принципе даже если invoices используется не как пивот а как обычная сущность – всё равно на ней есть article_id и user_id и по ним всё равно можно сделать уникальный индекс.
Не в сети
не вижу в invoices поля user_id. вообще получается что пользователи и articles связаны отношениями многие-ко-многим, а invoices - пивот-таблица с набором доп. свойств и полями article_id, user_id, ... очевидно что если на связи индекс по [user_id, article_id] объявить как уникальный, то на уровне СУБД добавляемые связи пользователей на статьи будут проверяться на уникальность и попытка добавления связи которая уже существует будет вызывать \PDOException. больше похоже на то что нужно?
не вижу смысла делать belongsToMany здесь.
в принципе даже если invoices используется не как пивот а как обычная сущность – всё равно на ней есть article_id и user_id и по ним всё равно можно сделать уникальный индекс.
Я в место user_id хочу использовать email т.к добавлять invoice могут как зарегистрированные пользователи так и обычные гости сайта у которых естественно нет user_id. Вопрос в том как именно этот уникальный индекс сделать ?! Я просто не полностью освоил миграции !
Не в сети
ну здесь не только в миграциях дело, надо бы и mysql знать. вообще просто, если через миграции – что-то типа
$table->unique(['article_id', 'email']);
ps. или наоборот – ['email', 'article_id']. такой индекс может использоваться в выборках только по первому полю или по обоим. но не может – только по второму. если выбираешь часто все покупки по email – второй вариант, если «все, кто купил такую-то статью» – первый
Изменено constb (09.03.2017 12:20:29)
Не в сети
ну здесь не только в миграциях дело, надо бы и mysql знать. вообще просто, если через миграции – что-то типа
$table->unique(['article_id', 'email']);
ps. или наоборот – ['email', 'article_id']. такой индекс может использоваться в выборках только по первому полю или по обоим. но не может – только по второму. если выбираешь часто все покупки по email – второй вариант, если «все, кто купил такую-то статью» – первый
А как "unique" со вторым параметром работает в данном случае ?
Задача такова что нужно вернуть текст ошибки пользователю если у article_id (к примеру 1) уже существует invoice с мылом example@mail.com а пользователь именно его пытается добавить. Такое решение выполнит данную задачу ?
Спасибо за помощь !!!!
Не в сети
Задача такова что нужно вернуть текст ошибки пользователю если у article_id (к примеру 1) уже существует invoice с мылом example@mail.com а пользователь именно его пытается добавить. Такое решение выполнит данную задачу ?
да, будет \PDOException – лови его и может даже проверить по подстроке в $exception->getMessage(), типа
if (strstr(strtolower($e->getMessage()), 'duplicate entry')) { /* попытка купить уже купленную статью */ }
Не в сети
Задача такова что нужно вернуть текст ошибки пользователю если у article_id (к примеру 1) уже существует invoice с мылом example@mail.com а пользователь именно его пытается добавить. Такое решение выполнит данную задачу ?
да, будет \PDOException – лови его и может даже проверить по подстроке в $exception->getMessage(), типа
if (strstr(strtolower($e->getMessage()), 'duplicate entry')) { /* попытка купить уже купленную статью */ }
Все работает, спасибо большое !
Не в сети
Страницы 1