CakePHP: Найти "Группы", где "Участники" этой группы не являются текущим авторизованным пользователем
У меня есть модель групп и модель пользователей.
Группы имеют и принадлежат многим пользователям. Пользователи имеют и принадлежат ко многим группам.
Я пытаюсь создать результирующий набор групп, где пользователи группы не включают идентификатор текущего пользователя, вошедшего в систему. Я попытался использовать условное выражение в параметре "Содержать", и я попытался сделать это с помощью внутреннего соединения, но результаты всегда дают группы, к которым в данный момент принадлежит пользователь.
Если бы не мой собственный запрос MySQL, мне было интересно, есть ли способ сделать это, используя исключительно модели CakePHP.
Примеры того, что я пробовал:
$otherMatches = $this->Group->find('all', array('joins' => array(array('table' => 'cake_users_groups', 'alias' => 'GroupsUsers', 'type' => 'inner', 'conditions' => array('GroupsUsers.group_id !=' => $groupId, 'GroupsUsers.user_id !=' => $this->Auth->user('id')))), 'limit' => 10, 'order' => array('rand()')));
а также
$otherMatches = $this->Group->find('all', array(
'contain' => array(
'User' => array(
'UsersGroup' => array(
'conditions' => array('UsersGroup.user_id !=' => $this->Auth->user('id));
)
)
)
), 'limit' => 10, 'order' => array('rand()')));
Кто-нибудь может дать мне какие-либо предложения?
Заранее спасибо.
1 ответ
Решил это с помощью подзапроса:
$conditionsSubQuery['`UsersGroup`.`user_id`'] = $this->Auth->user('id');
$db = $this->UsersGroup->getDataSource();
$subQuery = $db->buildStatement(
array(
'fields' => array('`UsersGroup`.`group_id`'),
'table' => $db->fullTableName($this->UsersGroup),
'alias' => 'UsersGroup',
'limit' => null,
'offset' => null,
'joins' => array(),
'conditions' => $conditionsSubQuery,
'order' => null,
'group' => null
),
$this->UsersGroup
);
$subQuery = ' `Group`.`id` NOT IN (' . $subQuery . ') ORDER BY RAND() LIMIT 10 ';
$subQueryExpression = $db->expression($subQuery);
$conditions[] = $subQueryExpression;
$otherMatches = $this->Group->find('all', compact('conditions'));