2015-11-14 5 views
0

Ok, так что у меня есть это:CakePHP - Поиск записей не связанных записей

$user_id = AuthComponent::user('id'); 
$joins = [ 
     ['table' => 'subscriptions', 
      'alias' => 'Subscription', 
      'type' => 'INNER', 
      'conditions' => [ 
       'Subscription.thread_id = Thread.id', 
       'Subscription.user_id = '.$user_id 
      ] 
     ] 
    ]; 

    $unsubscribed = $this->Thread->find('all',[ 
     'contain' => [ 
      'Subscription' => ['conditions' => ['Subscription.user_id' => $user_id]] 
     ], 
     'joins' => $joins, 
     'fields' => ['name','modified'], 
     'limit' => 10 
    ]); 

    debug($unsubscribed); 

Это в основном находит все темы с подпиской, прикрепленной к текущему пользователю. Что я действительно хочу, это отрицательный результат. Или другими словами: все потоки, которые не имеют подписки текущего пользователя? Есть ли способ сделать условия отрицательными? Или что-то типа того?

+0

насчет ' 'Subscription.user_id =!' $ User_id' в' $. joins' –

ответ

0

Предполагая, что ваши отношения:

  • Thread hasMany Подписка
  • Подписка belongsTo Thread

Ваш SQL будет:

SELECT Thread.* 
FROM threads AS Thread 
LEFT JOIN subscriptions AS Subscription 
    ON Thread.id = Subscription.thread_id 
    AND Subscription.user_id = ##user_id## 
WHERE Subscription.user_id IS NULL; 

Ключевым понятием является то, что вам нужно LEFT JOIN, а не INNER JOIN. Этот SQL присоединяет все потоки ко всем подпискам пользователя И не устраняет эти строки нитей, которые не имеют подписки (т. Е. Цель LEFT JOIN). Затем выбрать только записи, которые не имеют подписку (как найти в ИНЕКЕ)

переводя CakePHP:

$user_id = AuthComponent::user('id'); 
$joins = [ 
    ['table' => 'subscriptions', 
     'alias' => 'Subscription', 
     'type' => 'LEFT', 
     'conditions' => [ 
      'Subscription.thread_id = Thread.id', 
      'Subscription.user_id = '.$user_id 
     ] 
    ] 
]; 

$unsubscribed = $this->Thread->find('all',[ 
    'conditions' => ['Subscription.user_id' => null], 
    'joins' => $joins, 
    'fields' => ['name','modified'], 
    'limit' => 10 
]); 

debug($unsubscribed); 
+0

Звучит правильно, но я не могу заставить его работать. Я полагаю, вы имели в виду условие: 'conditions' => ['Subscription.user_id =!' => $ user_id], Но это тоже не работает. Он просто возвращает пустой массив. И я действительно проверял, что существуют действительные результаты. –

+0

''conditions' => ['Subscription.user_id' => null]' должен генерировать 'WHERE Subscription.user_id IS NULL' – bancer

+0

Спасибо. Это имеет смысл и, похоже, делает трюк –

Смежные вопросы