2015-06-09 2 views
0

У меня есть follwing код:присоединиться и orwhere концы И

$_duplicates = $this->find() 
    ->innerJoin(
     ['c' => 'contacts'], //alias 
     [ 
      'Contacts.contactname != ' => '', 
      'Contacts.id < c.id', 
      'c.id > ' => 0 
     ] 
     ) 
    ->select(['Contacts.id', 'Contacts.contactname', 'Contacts.legalname', 
       'c.id', 'c.contactname', 'c.legalname']) 
    ->orWhere([ 
     'LEVENSHTEIN(Contacts.contactname, c.contactname) <= ' => $distance, 
     'LEVENSHTEIN(Contacts.contactname, c.legalname) <= ' => $distance, 
     'LEVENSHTEIN(Contacts.legalname, c.contactname) <= ' => $distance, 
     'LEVENSHTEIN(Contacts.legalname, c.legalname) <= ' => $distance 
     ]); 
debug($_duplicates); 

отладки есть дает следующий вывод:

SELECT Contacts.id AS `Contacts__id`, Contacts.contactname AS `Contacts__contactname`, 
    Contacts.legalname AS `Contacts__legalname`, c.id AS `c__id`, 
    c.contactname AS `c__contactname`, c.legalname AS `c__legalname` 
FROM contacts Contacts 
INNER JOIN contacts c 
ON (Contacts.contactname != :c0 AND Contacts.id < c.id AND c.id > :c1) 
WHERE (
    Contacts.active = :c2 
    AND (
     LEVENSHTEIN(Contacts.contactname, c.contactname) <= :c3 
     AND LEVENSHTEIN(Contacts.contactname, c.legalname) <= :c4 
     AND LEVENSHTEIN(Contacts.legalname, c.contactname) <= :c5 
     AND LEVENSHTEIN(Contacts.legalname, c.legalname) <= :c6 
    ) 
) 

Любой язь, почему я получаю AND-s на Левенштейн звонки и не OR ? или Где-то должны создавать ОР-отношения, верно?

ответ

1

Потому что это не так, как orWhere() должен работать, то условие OR используется для комбинирования с предыдущими условиями, которые были определены с помощью where/andWhere/orWhere(), т.е.

->where(['a' => 'b']) 
->orWhere(['c' => 'd', 'e' => 'f']) 

приводит

(c = d AND e = f) OR a = b 

Если вам необходимо объединить все ваши условия с помощью OR, вы можете либо использовать несколько звонков orWhere()

->orWhere(['a' => 'b']) 
->orWhere(['c' => 'd']) 
->orWhere(['e' => 'f']) 

в OR ключ

->where([ 
    'OR' => [ 
     'a' => 'b' 
     'c' => 'd' 
     'e' => 'f' 
    ] 
]) 

или выражения

->where(function (\Cake\Database\Expression\QueryExpression $exp) { 
    return 
     $exp->or_([ 
      'a' => 'b' 
      'c' => 'd' 
      'e' => 'f' 
     ]); 
}) 

Смотрите также Cookbook > Database Access & ORM > Query Builder > Advanced Conditions

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