Я работаю над своим проектом SimpleSite и столкнулся с проблемой с моим вспомогательным классом базы данных при создании вспомогательных классов RBAC. Проблема делает JOIN
с использованием нескольких таблиц. Конкретный запрос можно увидеть здесь:
SELECT SS_roles.name, SS_roles.is_admin, SS_privileges.name AS priv
FROM SS_roles
LEFT JOIN SS_role_privs ON role_id=SS_roles.id
LEFT JOIN SS_privileges ON priv_id=SS_privileges.id
WHERE SS_roles.name='Guest';
Во время построения запроса я предварительно ожидаю имя таблицы в начале столбца с внешним ключом. Проблема в том, что таблица со столбцом не всегда та, к которой мы хотим присоединиться (как в случае с priv_id
от SS_role_privs
). Если бы я попытался использовать select () так, как я хочу, я бы закончил с этим (примечание SS_roles.SS_role_privs.priv_id
напоследок JOIN
):
SELECT SS_roles.name, SS_roles.is_admin, SS_privileges.name
FROM SS_roles
LEFT JOIN SS_role_privs ON SS_roles.id=SS_role_privs.id
LEFT JOIN SS_privileges ON SS_roles.SS_role_privs.priv_id=SS_privileges.id
WHERE SS_roles.name='Guest';
Проблема вызвана строкой здесь: https://github.com/Jonnycake/SimpleSite/blob/master/includes/classes/simpledb.class.php#L350
Я могу обойти это с помощью SimpleDB, чтобы открыть SS_role_privs
стол вместо SS_roles
— таким образом оба внешних ключа будут из одной таблицы, но я хотел бы сделать так, чтобы я мог создать запрос, точно такой же, как приведенный выше (выбирая из SS_roles
использование функции select () и не требует таблицы отношений для каждого соединения с несколькими таблицами. Я думал о том, чтобы определить, содержит ли объединяемое имя столбца точку, и если нет, то не стоит предварительно указывать имя таблицы, но если я правильно помню, MySQL поддерживает точки в именах таблиц, если они заключены в обратные галочки.
Будем весьма благодарны за любые предложения о том, как обрабатывать объединения.
Изменить: быстрое решение для возможного решения — есть отдельный класс для связанных таблиц, где вы говорите
$ss_role_privs=new SDBRelation("role_privs",
array("priv_id"=>"privileges.id",
"role_id"=>"roles.id")
);
$ss_role_privs->select(
array("roles.name",
"roles.is_admin",
"privileges.name"),
array(
"AND"=>array("roles.name"=>array(
"op"=>'=',
"value"=>'Guest'
)
)
),
"LEFT");
Однако, как я уже сказал, я бы предпочел не требовать таблицы отношений для каждого соединения с несколькими таблицами (хотя оно должно быть независимо).
Проблема действительно заключается в том, что если у вас есть что-то вроде этого:
-----------
| Table_1 |
-----------
| x | y |
-----------
-----------
| Table_2 |
-----------
| x | y |
----------------------
| Table_3 |
-----------
| x | y |
-----------
И отношения таковы, что Table_1.y относится к Table_2.x, а Table_2.y относится к Table_3.x, вы не можете присоединиться к таблице 3, когда выбираете из table_1 мой класс.
Задача ещё не решена.
Других решений пока нет …