У меня есть отношение habtm между пользователями и тегами. Однако это работает так, что наш список тегов поддерживается отдельно от пользователей. Такие, которые говорят, что в настоящее время существует ровно 12 тегов и N
пользователей. По мере добавления, добавления и удаления новых пользователей количество тегов не изменится, но количество записей в таблице taggeds_users будет увеличиваться, чтобы точно отражать теги всех пользователей. Эта часть работает.
Кроме того, существует интерфейс, который позволяет пользователям фильтровать отмеченных пользователей по их тегам. Этот интерфейс разработан таким образом, что если у пользователя A
есть теги Monday
и Tuesday
, они будут отображаться в поиске по любому из них. Кроме того, если пользователь B
имеет теги Monday
и Wednesday
и предварительно выполняется поиск для поиска пользователей, которые включают тег Monday
и исключают тег Wednesday
, тогда пользователь B
не должен отображаться (исключения превосходят включения).
Cake может управлять требованием включения тегов в поиск, и отдельно Cake может управлять требованием исключения тегов. Проблема заключается в том, чтобы заставить Cakephp «знать», что, когда пользователь C
имеет теги X
и Z
, и выполняется поиск запрошенных пользователей, включая тег X
и исключая тег Z
, этот пользователь C
НЕ должен появляться. В настоящее время пользователь C
действительно появляется в результатах.
Я понимаю, что это результат операции соединения, которую необходимо выполнить в БД. т. е. поскольку у пользователя C
есть два тега, у этого пользователя также есть две записи, возвращенные из БД. Cake правильно игнорирует один, но другой имеет правильный тег и позволяет пользователю C
вводить наборы результатов, которые не предназначены для этого пользователя. Есть ли способ заставить торт решить эту проблему. Я могу исправить это на сервере (удалить пользователя C
в контроллере, но я чувствую, что упускаю что-то простое). Это запрос, который привлекает внимание пользователей к тегам:
$conditions = array(
'AND' => array(
'Tagging.tag_name' => array(
(int) 0 => 'tech'
),
'NOT' => array(
'Tagging.tag_name' => array(
(int) 0 => 'monday'
)
)
)
);
// I am also using the join options to preform this search
$joins[] = array(
'table' => 'taggings_users',
'alias' => 'TaggingUser',
'type' => 'inner',
'conditions' => array(
'User.id = TaggingUser.user_id'
)
);
$joins[] = array(
'table' => 'taggings',
'alias' => 'Tagging',
'type' => 'inner',
'conditions' => array(
'TaggingUser.tagging_id = Tagging.id'
)
);
// which powers this operation
$this->paginate = array( 'conditions' => $conditions, 'joins' => $joins, 'limit' => 50 );
// there are users in here that should not be
$users = $this->paginate('User');
// thank you to anyone who helps.
X
. Если полеtag
=X
, это не может быть чем-то другим. Это похоже на состояниеif name="bob" AND NOT name="sally"
. - person Costa   schedule 08.08.2013