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'));
Другие вопросы по тегам