Для знатоков SQL-я.
Мне панадобилась хитрая выборка WHERE condition AND (condition2 OR condition3). Обратите внимание, что здесь принципиальная разница по сравнению с WHERE condition AND condition2 OR condition3, так как во втором случае в результат попадут записи по условию OR (третьего условия) независимо от успеха первого и второго условия. А так получается, что первое условие должно выполниться обязательно, а второе или третье — как получится (но обязательно хотя бы или первое, или второе). И само собой это должно быть на xPDO.
Итак, запрос:
$uid = $modx->user->get('id'); $q = $modx->newQuery('ModzillaAccess'); $q->leftJoin('modUserGroupMember', 'membergroup', "ModzillaAccess.principal_class='modUserGroup' AND ModzillaAccess.principal = membergroup.user_group"); $q->leftJoin('modAccessPolicy', 'policy', "ModzillaAccess.policy=policy.id"); $q->select(array( "ModzillaAccess.*", "policy.data as acl", )); $q->where(array( "target" => 1, )); $q->andCondition(array( "principal_class" => 'modUser', "AND:ModzillaAccess.principal:=" => $uid, )); $q->orCondition(array( "principal_class" => 'modUserGroup', "AND:membergroup.member:=" => $uid, ));
То есть здесь выборка делается или по пользователю, или по группе пользователя.