Yii1 условие отношения многие-многие в defaultScope конфликтует с поиском () - PullRequest
0 голосов
/ 08 мая 2019

У меня есть 3 таблицы: clients, clients_traders_relation, traders

Это отношение многие-многие, у клиентов может быть много трейдеров, а у трейдеров может быть много клиентов.

У меня есть 2 отношения в модели clients:

'traderssearch' => array(self::MANY_MANY, 'traders', 'clients_traders_relation(relation_id, trader_id)'),
'traders' => array(self::MANY_MANY, 'traders', 'clients_traders_relation(relation_id, trader_id)'),

Отношение traderssearch используется для ограничения доступа к клиентам, которые не принадлежат текущему трейдеру (поэтому трейдеры видят только их клиенты, или если они являются одним из трейдеров).Отношение traders используется для получения всех трейдеров (это решение я получил из моего другого вопроса, потому что одно отношение вернет только текущего трейдера, даже если их больше.

Используется в defaultScopeкак это:

return array(
    'alias' => $class,
    'with' => array(
        'traderssearch' => array(
        'together' => true,
        'condition' => 'traderssearch.id='. Yii::app()->user->getId()),
    'traders',
),

Однако мне бы хотелось иметь возможность искать клиентов какого-то другого трейдера. Допустим, у меня есть 3 клиента:

  1. Клиент A, трейдеры: я, XYZ
  2. Клиент B, трейдеры: я
  3. Клиент C, трейдеры: XYZ

Я хочу найти клиента XYZ.вернуть только Client A, потому что это единственный клиент, связанный как со мной, так и с XYZ.

Я сделал это в search ():

$criteria->with = 'traderssearch';
$criteria->together = true;
$criteria->compare('traderssearch.id', $this->search_trader);

search_trader - добавлена ​​дополнительная переменнаяк модели, так что он может быть использован для поиска. Если я отображаю список клиентов без использования поиска, он работает нормально. Но если я пытаюсь найти клиента XYZ, он ничего не возвращает мне. Я думаю, это потому, что оба из нихусловия сами себя исключают, иногданг, как id = 10 AND id = 20, который никогда не будет правдой.Я попытался добавить OR к compare(), но это не сработало.

Если я удаляю условие из defaultScope, поиск работает, потому что теперь есть только одно условие для поиска идентификатора трейдера.Есть ли способ сохранить как defaultScope, так и условия поиска?Мне нужно другое, третье отношение?

...