Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 08.03.2017 13:31:34

Связать уникальные данные

Есть таблица articles (id, title, content,........) и таблица invoices (id, article_id,email,price,......)

Как сделать уникальную связку между article_id и email в таблице invoices ? Смысл в том, что бы один пользователь мог добавить только одну заявку на один article. То бишь пользователь с мылом example@mail.com мог кинуть заявку на article 1, 2, 3, 4, только по одному разу на каждый !? Спасибо

Не в сети

#2 08.03.2017 17:00:39

TrueKanonir
Откуда: Ташкент
Сообщений: 221

Re: Связать уникальные данные

Может просто проверкой обойтись?

Не в сети

#3 08.03.2017 17:05:04

Re: Связать уникальные данные

Нет, не вариант. Есть идеи какие-нибудь

Изменено MeKree (08.03.2017 17:05:36)

Не в сети

#4 09.03.2017 05:32:29

Re: Связать уникальные данные

не вижу в invoices поля user_id. вообще получается что пользователи и articles связаны отношениями многие-ко-многим, а invoices - пивот-таблица с набором доп. свойств и полями article_id, user_id, ... очевидно что если на связи индекс по [user_id, article_id] объявить как уникальный, то на уровне СУБД добавляемые связи пользователей на статьи будут проверяться на уникальность и попытка добавления связи которая уже существует будет вызывать \PDOException. больше похоже на то что нужно? в принципе даже если invoices используется не как пивот а как обычная сущность – всё равно на ней есть article_id и user_id и по ним всё равно можно сделать уникальный индекс.

Не в сети

#5 09.03.2017 12:15:19

Re: Связать уникальные данные

constb пишет:

не вижу в invoices поля user_id. вообще получается что пользователи и articles связаны отношениями многие-ко-многим, а invoices - пивот-таблица с набором доп. свойств и полями article_id, user_id, ... очевидно что если на связи индекс по [user_id, article_id] объявить как уникальный, то на уровне СУБД добавляемые связи пользователей на статьи будут проверяться на уникальность и попытка добавления связи которая уже существует будет вызывать \PDOException. больше похоже на то что нужно?

не вижу смысла делать belongsToMany здесь.

constb пишет:

в принципе даже если invoices используется не как пивот а как обычная сущность – всё равно на ней есть article_id и user_id и по ним всё равно можно сделать уникальный индекс.

Я в место user_id хочу использовать email т.к добавлять invoice могут как зарегистрированные пользователи так и обычные гости сайта у которых естественно нет user_id. Вопрос в том как именно этот уникальный индекс сделать ?! Я просто не полностью освоил миграции !

Не в сети

#6 09.03.2017 12:18:38

Re: Связать уникальные данные

ну здесь не только в миграциях дело, надо бы и mysql знать. вообще просто, если через миграции – что-то типа

$table->unique(['article_id', 'email']);

ps. или наоборот – ['email', 'article_id']. такой индекс может использоваться в выборках только по первому полю или по обоим. но не может – только по второму. если выбираешь часто все покупки по email – второй вариант, если «все, кто купил такую-то статью» – первый

Изменено constb (09.03.2017 12:20:29)

Не в сети

#7 09.03.2017 12:26:38

Re: Связать уникальные данные

constb пишет:

ну здесь не только в миграциях дело, надо бы и mysql знать. вообще просто, если через миграции – что-то типа

$table->unique(['article_id', 'email']);

ps. или наоборот – ['email', 'article_id']. такой индекс может использоваться в выборках только по первому полю или по обоим. но не может – только по второму. если выбираешь часто все покупки по email – второй вариант, если «все, кто купил такую-то статью» – первый

А как "unique" со вторым параметром работает в данном случае ?
Задача такова что нужно вернуть текст ошибки пользователю если у article_id (к примеру 1) уже существует invoice с мылом example@mail.com а пользователь именно его пытается добавить. Такое решение выполнит данную задачу ?

Спасибо за помощь !!!!

Не в сети

#8 09.03.2017 14:06:56

Re: Связать уникальные данные

Задача такова что нужно вернуть текст ошибки пользователю если у article_id (к примеру 1) уже существует invoice с мылом example@mail.com а пользователь именно его пытается добавить. Такое решение выполнит данную задачу ?

да, будет \PDOException – лови его и может даже проверить по подстроке в $exception->getMessage(), типа

if (strstr(strtolower($e->getMessage()), 'duplicate entry')) { /* попытка купить уже купленную статью */ }

Не в сети

#9 10.03.2017 15:25:27

Re: Связать уникальные данные

constb пишет:

Задача такова что нужно вернуть текст ошибки пользователю если у article_id (к примеру 1) уже существует invoice с мылом example@mail.com а пользователь именно его пытается добавить. Такое решение выполнит данную задачу ?

да, будет \PDOException – лови его и может даже проверить по подстроке в $exception->getMessage(), типа

if (strstr(strtolower($e->getMessage()), 'duplicate entry')) { /* попытка купить уже купленную статью */ }

Все работает, спасибо большое !

Не в сети

Подвал раздела