Laravel по-русски

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

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

#1 28.05.2020 21:35:48

Таблица "связей"

Здравствуйте, я новичок. Многократно видел такую ситуацию. Например. Имеем блог. Создаем миграцию для поста(стандартную), затем миграцию для тэгов. И нужно еще создать миграцию связи типа "Пост-тег". Только я не понимаю, что именно мы решаем таким образом и чем это удобно? Если миграцию поста и тэга я понимаю, что к чему, тов миграции пост-тег, вообще не понимаю, что там происходит и зачем она нужна.

Спасибо большое за внимание!

Не в сети

#2 29.05.2020 01:05:58

Re: Таблица "связей"

1 пост может иметь несколько тегов.
Постов может быть много.

Такая таблица называется многие-ко-многим

Не в сети

#3 29.05.2020 07:34:44

Re: Таблица "связей"

@JohnnyDoe, это не из-за Laravel, а происходит из особенностей реляционных баз данных. Многие-ко-многим в РСУБД делаются через таблицу-связку, иначе говоря, pivot. Ларавель только предоставляет доступ к БД. Если в базе должна быть таблица, значит должна быть и миграция чтобы её создать.

Совет: если в миграции для таблицы-связки ты объявишь уникальный составной индекс на пару полей (post_id, tag_id), то избежишь потенциальных проблем с дублированием записей.

Изменено artoodetoo (29.05.2020 07:35:57)


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

#4 29.05.2020 11:38:56

Re: Таблица "связей"

@JohnnyDoe, это не из-за Laravel, а происходит из особенностей реляционных баз данных. Многие-ко-многим в РСУБД делаются через таблицу-связку, иначе говоря, pivot. Ларавель только предоставляет доступ к БД. Если в базе должна быть таблица, значит должна быть и миграция чтобы её создать.

Совет: если в миграции для таблицы-связки ты объявишь уникальный составной индекс на пару полей (post_id, tag_id), то избежишь потенциальных проблем с дублированием записей.

Ого очень признателен за подробный ответ. Может есть где почитать об этом?
Получается схема, если я делаю таблицу пост и там создаю ключ tag_id, и потом во время добавления поста ставлю туда условие "вставать в поле tag_id, где tag_id = id(тут переменная айдишника тэга из таблицы tag)", так не пойдёт? Или это считается дурным тоном и непрактично?

Не в сети

#5 29.05.2020 12:31:55

Re: Таблица "связей"

это не дурной тон, это связь один-ко-многим.
Таким способом можно для 1 поста указать только 1 тэг.

То есть таблица Post будет выглядеть так:

id, tag_id
1      , 1
2      , 1
3      , 2
4      , 3

Таким образом создать одному посту несколько разных тегов будет невозможно.

Не в сети

#6 29.05.2020 17:17:15

Re: Таблица "связей"

Таким образом создать одному посту несколько разных тегов будет невозможно.

Ааа то есть, благодаря такой таблице, можно будет уже несколько тегов назначить?

Где можно посмотреть примеры реальных таблиц, их архитектура? А-то я чем больше изучаю, тем больше понимаю. что вообще не шарю.

Не в сети

#7 29.05.2020 20:34:58

Re: Таблица "связей"

Post

id, title
1, Юность
2, Молодость
3, В расцвете сил
4, Старость

Tag

id, name
1, кино
2, вино
3, домино
4, клестир
5, сортир

PostTags

post_id, tag_id
1, 1
2, 1
2, 2
3, 2
3, 3
4, 4
4, 5

Не в сети

#8 29.05.2020 21:06:28

Re: Таблица "связей"

Хм, получается, когда мы добавляем данные, надо также добавлять и в эту таблицу данные в тот же самый момент?

Не в сети

#9 29.05.2020 21:30:46

Re: Таблица "связей"

Нет, не получается.
В таблицу связей можно накидать теги в любой момент после создания записи в постах.
Это можно сделать сразу, можно через любой промежуток времени после.

Не в сети

#10 31.05.2020 10:41:10

Re: Таблица "связей"

Нет, не получается.
В таблицу связей можно накидать теги в любой момент после создания записи в постах.
Это можно сделать сразу, можно через любой промежуток времени после.

Всё теперь всё понял, спасибо большое!

Не в сети

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