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

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

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

Студворк — интернет-сервис помощи студентам
Здравствуйте, изучаю 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
2600 / 1504 / 689
Регистрация: 23.08.2015
Сообщений: 3,804
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
2600 / 1504 / 689
Регистрация: 23.08.2015
Сообщений: 3,804
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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru