Проблемы с присоединением к классу базы данных My Database

Я работаю над своим проектом 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 мой класс.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]