BonBonSlick
@BonBonSlick
Junior Web Developer Trainee

Сложный под запрос, как правильно составить?

DB driver: PostgreSQL
->join('region as region', function ($join) use ($localLang, $userDetails) {
                    $join->on('songs.restriction_id', '=', 'region.relation_restriction_id')
                        ->where('region.slug', 'ILIKE', '%global%')
                        ->where('songs.restriction_type', '=', 1)
                        ->orWhere('region.slug', 'ILIKE', '%' . $userDetails->region . '%')
                        ->where('songs.restriction_type', '=', 1)
                        ->orWhere('songs.restriction_type', '=', 2)
                        ->where('region.slug', '!ILIKE', 2);????
                })


В данном запросе, я делаю джойн на таблицу блокирововк по региону. Идет выборка музыки, в разных регионах она запрещена. Есть два типа блокировки:
1 - музыка доступна только в данном регионе
2 - музыка запрещена только в данном регионе.

Когда юзер делает поиск, мы возвращаем ему музыку ту, которая доступна глобально + только в его регионе.
->where('region.slug', 'ILIKE', '%global%')
                        ->where('songs.restriction_type', '=', 1)
                        ->orWhere('region.slug', 'ILIKE', '%' . $userDetails->region . '%')
                        ->where('songs.restriction_type', '=', 1)

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

Осталось, исключить музыку которая недоступна для региона юзера.
->orWhere('songs.restriction_type', '=', 2)
->where('region.slug', '!ILIKE', '%' . $userDetails->region . '%'); ?
->where('region.slug', 'NOT ILIKE', '%' . $userDetails->region . '%'); ?
->where('region.slug', 'NOT LIKE', '%' . $userDetails->region . '%'); ?
? // отфильтровать всю музыку которая запрещена для региона юзера

2-й типа блокировки, музыка недоступна в регионе юзера.

Таблица региональной блокировки:
id | relation_restriction_id | lang | name | slug |  descr |  timestamps

relation_restriction_id отвечает за связь между категориями под разные языки. То есть:
row = 1 | 233 | en | Global | global-en | descritpion blah blah blah | timestamps 
row = 2 | 233 | ru | Всемирная | global-ru | описание                     | timestamps 
row = 3 | 234 | de | Hlobal | global-de | na nemezkom opisanie      | timestamps

Остальные поля думаю не нужны в обьяснении.

Пока выдает ошибки в виде:
"SQLSTATE[0A000]: Feature not supported: 7 ERROR:  FOR SHARE is not allowed with GROUP BY clause (SQL: select....

Данная ошибка видимо из-за того, что использован SELECT ... FOR UPDATE или ->sharedLock() который надо так же использовать в запросе. Пример с поиском это лишь пример.

Не знаю как правильно подойти теперь к запросу, можно ли его сделать на Laravel? Подзапросы? Или как лучше и правильно?
  • Вопрос задан
  • 643 просмотра
Решения вопроса 1
Hateman31
@Hateman31
Делиться мыслями - это круто!
Когда юзер делает поиск, мы возвращаем ему музыку ту, которая доступна глобально + только в его регионе.

  1. Запрос 1: музыка, которая доступна глобально
  2. Запрос 2: музыка, которая доступна в регионе
  3. Запрос 3: левое соединение запрос1 и запрос 2
  4. ???
  5. Profit!!!
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы