объединить два Where с И в zend 2

#merge #zend-framework2 #conditional-statements #where

#объединить #zend-framework2 #условные операторы #где

Вопрос:

У меня проблема с объединением двух условий в моем запросе

 public function GetInbox($user_id , $line_number = false , $seeall = false , $limit = 0,$SearchWhere = null)
{
    if(!$SearchWhere)
        $SearchWhere = new Where();

    if(!$seeall)
    {
        $UsersLineTable = new UsersLinesTable($this->adapter);
        $UsersLine = $UsersLineTable->fetchAll(array('user_id = ?' => $user_id,'owner_type = ?' => '1'));
        if(!$UsersLine) return false;

        $SearchWhere2 = new Where();
        foreach ($UsersLine as $key => $value) { 
            $SearchWhere2->equalTo("recipient_number",$value['line_number'])
                  ->or
                  ->equalTo("recipient_number",'98'.$value['line_number'])
                 ->or;
        }

        $Select = new Select();
        $Select->where($SearchWhere2);
        $Select->where($SearchWhere);
        if($limit)
            $Select->limit($limit);
        $Select->order("receive_date DESC"); 
        $MessageProvidersInboxTable = new MessageProvidersInboxTable($this->adapter);
        return $MessageProvidersInboxTable->fetchBySelect($Select);
    }else{
        $MessageProvidersInboxTable = new  MessageProvidersInboxTable($this->adapter);
        return $MessageProvidersInboxTable->fetchAll($SearchWhere);
    }
}
 

$SearchWhere — это класс Where,
$SearchWhere2 — вторые условия

В этом случае

 $Select->where($SearchWhere2);
$Select->where($SearchWhere);
 

$select просто содержит условия $SearchWhere.

Я хочу, чтобы этот запрос

 Where condition1 AND (condition2)
 

так ли важно, чтобы условие2 содержало условия, включающие операнд OR.
С уважением

Ответ №1:

Попробуйте это, это должно сработать. Запись без просмотра кода zend db:

 $where = new ZendDbSqlWhere;

$where->addPredicate($SearchWhere, $where::OP_AND);
$where->addPredicate($SearchWhere2, $where::OP_AND);

$select->where($where);
 

По сути, Where object является подклассом Predicate . Поэтому он должен работать как любой другой предикат.

Комментарии:

1. Спасибо, это другой способ $select->where($SearchWhere); $select-> addPredicate($SearchWhere2);

2. другой способ не будет работать так, как вы ожидаете where = a or b , и where2 = c даст a or b and c , и вам нужно (a or b) and c

3. Я отслеживаю запросы mysql, и это работает для моего случая where1 И (where2)

4. я говорю о a or b and (where2) -> a or (b and (where2))