У меня есть полиморфная таблица creationables
, и я не могу определить ключевую часть для условного запроса, который возвращает все creationables
на основе значения поля creationable_type
(human
или robot
) на основе были ли они удалены из соответствующих таблиц (humans
, robots
и комбинированные robots
и robot_upgrades
). Вот 4 таблицы, за которыми следует псевдопросмотр:
1. creationables
| id | creationable_type | creationable_id | robot_upgrade_id | is_activated
----------------------------------------------------------------------------
| 1 | human | 1 | 0 | 1
| 2 | robot | 1 | 0 | 1
| 3 | robot | 2 | 1 | 1
2. люди
| id | name | deleted
---------------------
| 1 | Adam | NULL
3. роботы
| id | name | deleted
------------------------
| 1 | Droid X | NULL
| 2 | Droid Y | NULL
4. robot_upgrades
| id | upgrade_name | deleted
--------------------------------
| 1 | Patch V4 | NOW()
Псевдопросмотр:
SELECT *
FROM creationables
// If creationable_type == 'human'
// we want to get non deleted humans
JOIN humans ON humans.id=creationable_id WHERE humans.deleted=NULL
// If creationable_type == 'robot' and robot_upgrade_id == '0'
// we want to get non deleted robots
JOIN robots ON robots.id=creationable_id WHERE robots.deleted=NULL
// If creationable_type == 'robot' and robot_upgrade_id != '0'
// we want to check both robots and robot_upgrades tables
// and if either of them was deleted we do not want to return them
// we want to get non deleted robots/robot_upgrades combo
JOIN robots ON robots.id=creationable_id WHERE robots.deleted=NULL
JOIN robot_upgrades ON robot_upgrades.id=robot_upgrade_id WHERE robot_upgrades.deleted=NULL
WHERE creationables.is_activated = '1'
Есть идеи, какой правильный условный запрос будет основан на комментариях к псевдопросу?
UPDATE
Вот скрипка
Ожидаемый результат должен выглядеть следующим образом:
| id | creationable_type | creationable_id | robot_upgrade_id | is_activated
----------------------------------------------------------------------------
| 1 | human | 1 | 0 | 1
| 2 | robot | 1 | 0 | 1
creationables
строка с идентификатором 3 не должна возвращаться, поскольку, хотя ее робот не удален из robots
, связанный с ним robot_upgrade_id
1 удаляется в robot_upgrades
.