Форум программистов, компьютерный форум, киберфорум
PHP: Laravel
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
2 / 2 / 0
Регистрация: 05.12.2018
Сообщений: 109

Промежуточное общение между таблицами

12.09.2023, 06:10. Показов 733. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, изучаю Laravel - появился вопрос в ORM.
Создал таблицы сделал связи - *Скрин

Дальше Определил модели:

PHP Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
class Album extends Model
{
    use HasFactory;
 
    protected $table = 'albums';
    
 
    public function musics()
    {
        return $this->belongsToMany(Music::class, "music_album");
    }
    
   
}
 
 
class Artist extends Model
{
    use HasFactory;
 
    protected $table = 'artists';
 
    public function musics()
    {
        return $this->belongsToMany(Music::class, "music_artist", 'id_music', 'id_artist');
    }
 
    
 
}
 
 
class Music extends Model
{
    use HasFactory;
 
    protected $table = 'musics';
 
    public function albums()
    {
        return $this->belongsToMany(Album::class, 'music_album', 'music_id', 'album_id');
    }
 
    public function artists()
    { 
        return $this->belongsToMany(Artist::class, 'music_artist', 'music_id', 'album_id');
    }
}
Вопрос следующего характера, если получать модель музыки и обращаться к Артисту и Альбому то это делается без проблем и понятно:

PHP Скопировано
1
2
3
4
 $music = Music::find(1);
 
 $music->artists[0]-name // выведит
 $music->album[0]-name // выведит
Но, что если я хочу напрямую обращаться через Artist к Album или наоборот Album к Artist, возможно ли как-нибудь это реализовать через ORM - не делая промежуточную таблице и если мы сразу отссем момент что я могу по связи "музыка" добираться.
Миниатюры
Промежуточное общение между таблицами  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.09.2023, 06:10
Ответы с готовыми решениями:

Отношения между таблицами laravel
Есть таблица пользователей(users), есть таблица компаний(companies). В каждой компании может быть много пользователей и у каждого своя...

Посоветуйте что-нибудь промежуточное между Шилтдом и Рихтером
Читал Шилтда, написал пару программ, стал читать Рихтера, но многое плохо запоминается и не совсем всё в его изложении удобно читается,...

Наладить связи между практически одинаковыми таблицами таблицами
Помогите пожалуйста со следующей затыкой. Выбираю "Схема данных". Там открыты три таблицы. Одна материнская (откуда идет номер модели)...

6
 Аватар для sad67man
2481 / 1406 / 665
Регистрация: 23.08.2015
Сообщений: 3,546
12.09.2023, 15:53
Xpystum, 1) У вас связь многие ко многим. Получается, что у Music может быть несколько артистов и несколько альбомов. Действительно ли такое нужно?
Если песня может быть только в одном альбоме и у него может быть только один артист, то промежуточные таблицы не нужны.

Далее вы должны ответить на несколько вопросов.
Может ли быть песня без альбома? Может ли быть альбом без артиста?
1
36 / 28 / 9
Регистрация: 02.01.2022
Сообщений: 131
13.09.2023, 18:07
1. Musics можно назвать songs или lyrics (я еле понял, о чём это тут)
2. Many-to-many (MTM) таблицы тоже называть во множественном числе
3. В MTM таблицах id-шник не нужен
4. Размерность интов должна быть одинаковая. Если в MTM таблице user_id int(11), то в users должен быть id int(11), а не int(7)
5. "Но, что если я хочу напрямую обращаться через Artist к Album или наоборот" - скорее всего дополнительные MTM таблицы

Цитата Сообщение от sad67man Посмотреть сообщение
Получается, что у Music может быть несколько артистов и несколько альбомов. Действительно ли такое нужно?
Конечно. Обычное дело, когда несколько исполнителей. Eminem ft. Dido - Stan
Одна песня может быть в нескольких альбомах. Например, песня "Последний герой" Цоя представлена в альбомах
а) "Последний герой", группа Кино
б) "Легенда", группа Кино
в) "Grand Collection", в которой 300 исполнителей. (сборники такие из 90-х)

Другое дело, стратегия, как эту песню хранить в таблице. Если мы считаем песню уникальной сущностью, тогда запись об этой песне в songs будет одна (идеальный вариант, но тогда нужны дополнительные поля в MTM таблицах, например, sort и т.д.). Или мы считаем, чтодве разные песни в разных альбомах - это две разные записи в таблице songs. Это тоже вариант, но менее интересный. Каждый раз нужен будет distinct и другие, боком вылазящие, проблемы.

Ещё одна стратегия в такого рода ресурсах:
Плодить MTM таблицы или в конкретном MTM таблице "фильтровать" данные с помощью дополнительных полей. Мне нравится первый вариант, т.к. диски сейчас дешёвые, а по названию таблицы (если их правильно именовать), сразу понятно, какие данные в ней лежат.
0
2 / 2 / 0
Регистрация: 05.12.2018
Сообщений: 109
13.09.2023, 19:37  [ТС]
Так, а какой вариант тогда через ORM обратиться от Artists к Albums - без создание дополнительных страниц и полей. Возможно ли это?
Насчёт ограничений по int, спасибо даже не подумал об этом)
0
36 / 28 / 9
Регистрация: 02.01.2022
Сообщений: 131
14.09.2023, 07:44
Цитата Сообщение от Xpystum Посмотреть сообщение
какой вариант тогда через ORM обратиться от Artists к Albums
Пока в цикле.
PHP Скопировано
1
2
3
4
foreach ($artist->songs as $song {
    $foreach($song->albums as $album) {
    }
}
0
 Аватар для sad67man
2481 / 1406 / 665
Регистрация: 23.08.2015
Сообщений: 3,546
14.09.2023, 13:10
Цитата Сообщение от umneeq2 Посмотреть сообщение
Одна песня может быть в нескольких альбомах.
Это может зависеть от конкретного проекта, как построят модель предметной области.

Xpystum, Если нам нужно вывести все альбомы конкретного артиста, то глупо это будет делать через песни, тем более если песня может состоять в других альбомах, которые в свою очередь могут относиться к другим артистам (судя по вашей реализации). Между альбомом и артистом должна быть прямая связь. Я бы делал связь один ко многим, чтоб альбом мог принадлежать только одному артисту, т.е. в таблице albums добавить поле artist_id с внешним ключом.
0
2 / 2 / 0
Регистрация: 05.12.2018
Сообщений: 109
16.09.2023, 04:41  [ТС]
Да я об этом как раз и думал, но меня напрягает то, что я делаю удобность для себя (для вывода Артистов и их альбомов добавляю таблицу и получается замыкаю по кругу данные), то-есть получается у меня лишняя таблица будет в БД, я понимаю если маленький проект, но если в больших работать? - лишняя таблица ARTIST -> ALBUMS (многие ко многим), когда данные я и так могу достать через музыку (что конечно будет сложнее)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.09.2023, 04:41
Помогаю со студенческими работами здесь

Вёрстка таблицами ( разрыв между таблицами в ie)
Добрый день, сверстал одну страницу для акции таблицами. В Google Chrome корректно отображается, а вот в ie между таблицами...

Общение между C++ и Java
Доброго времени суток, хотел узнать, как реализовать получение информации из C++ приложения в Java приложение ? Приложение на C++ общается...

Общение между формами?
Здравствуйте. Возможно глупый вопрос. Попытаюсь вкратце: Есть форма с кнопкой. По нажатии на кнопку нужно создать два объекта...

Общение между программами
Пусть есть некоторая программа, хранящая в себе алгоритм преобразования входных данных в выходные, и программа-потребитель, которая на...

Общение между диалогами
Здравствуйте. У меня такая ситуация: Имеется диалог: скажем CmyDlg. На нём к примеру две вкладки: CPage1 и CPage2. На CPage1...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Переменные в Python
py-thonny 10.04.2025
Переменная в программировании — это символическое имя, связанное с областью памяти, в которой хранится значение. Она позволяет получать доступ к данным через понятные человеку идентификаторы, а не. . .
Многопоточность в C#: Task и асинхронные операции
UnmanagedCoder 10.04.2025
Многопоточность позволяет выполнять несколько операций одновременно, что важно для решения двух основных задач: повышения скорости выполнения вычислительно-сложных операций и сохранения отзывчивости. . .
Линейное решение не линейной задачи (емкость вычислений в сравнении с традиционными решениями пока не определена).
Hrethgir 10.04.2025
В рамках предстоящих вычислений пришлось (да, я тоже знаю про корень числа, и про степеня, и прочие теоремы, но. . . ) найти способ нахождения отношения двух углов. . . .
Запуск контейнеров Docker на ARM64
Mr. Docker 09.04.2025
Появление таких решений, как Apple M1/ M2, AWS Graviton, Ampere Altra и Raspberry Pi, сделало использование ARM-систем обыденностью для многих разработчиков и DevOps-инженеров. При этом Docker,. . .
Vue SFC компонент на PHP с Fusion
Jason-Webb 09.04.2025
PHP на сервере и JavaScript на клиенте — классическое сочетание, которое, несмотря на свою эффективность, создает определенный когнитивный диссонанс при разработке. В этом контексте появляются. . .
TypeScript vs JavaScript: Отличия и когда что использовать
Reangularity 09.04.2025
JavaScript появился в 1995 году как творение Брендана Эйха и быстро стал основой интерактивности в вебе. За свою историю он прошел путь от простого языка для манипуляций с DOM до полноценной. . .
Подключение Kafka к Elasticsearch
Codd 09.04.2025
Apache Kafka и Elasticsearch — две мощные технологии, которые при совместном использовании создают эффективную платформу для обработки и анализа данных в реальном времени. Kafka, выступая в роли. . .
Реализации таймеров в Unity
GameUnited 09.04.2025
Время — важный ресурс любой игры. Разработка качественных игровых механик невозможна без грамотного управления временем, а таймеры выступают ключевым инструментом этого управления. Представьте себе. . .
Функции высшего порядка в JavaScript
run.dev 09.04.2025
Функции высшего порядка представляют собой один из фундаментальных камней функционального программирования в JavaScript. По сути, это функции, которые либо принимают другие функции в качестве. . .
Flutter: Оптимизация производительности сложных UI
mobDevWorks 09.04.2025
Когда речь идет о сложных интерфейсах, Flutter сталкивается с несколькими фундаментальными проблемами производительности. Одна из них — избыточная перерисовка (repainting), когда даже небольшие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер