Мне панадобилась хитрая выборка 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,
));
То есть здесь выборка делается или по пользователю, или по группе пользователя.