2016-02-03 7 views
0

Я хочу добавить круглую форму запроса, но я не знаю как. Вы можете мне помочь ? Мой SQL-запрос:Zend Predicate или Predicatset

SELECT * 
FROM vw_my_asn_header 
WHERE username = 'toto' 
    AND (shipment_number LIKE '20151106052811' OR 
     shipment_number LIKE '20151110053250' OR 
     shipment_number LIKE '20151116054359') 
ORDER BY message_id ASC 

Мой fonction:

public function searchSitesDeliveries($username, Search $search) 
{ 
    $select = $this->tableGateway->getSql()->select(); 
    array(new Predicate\Expression('username = ?', $username)),Predicate\PredicateSet::COMBINED_BY_AND); 

    if (!empty($search->get_shipment_number())) 
    { 
     $valeur = $search->get_shipment_number(); 
     if(is_array($valeur)) 
     { 
      $valeur = array_unique($valeur); 
      foreach ($valeur as $key => $value) 
      { 
       if($key == 0) 
       { 
       $predicate_set->andPredicate(new Predicate\Expression('shipment_number IN', '%'.$value.'%')); 
       $predicate_set->nest(); 
       $bool = true; 
       } 
       else 
       { 
        $predicate_set->orPredicate(new Predicate\Like('shipment_number', '%'.$value.'%'));  
       } 
      } 
      if($bool == true) 
      { 
       $predicate_set->unnest();        
      } 
     } 
     else { 
      $predicate_set->andPredicate(new Predicate\Like('shipment_number', '%'.$valeur.'%')); 
     } 
    } 

    $select->where($predicate_set); 
    $resultSet = $this->tableGateway->selectWith($select); 

    return $resultSet; 
} 

в $ predicate_set-> гнездо; возвращает мне следующую ошибку:

`Call to undefined method Zend\Db\Sql\Predicate\PredicateSet::nest()` 

Снаружи, в начале файла, I:

имен Front \ Model;

use Zend\Paginator\Adapter\DbSelect; 
use Zend\Paginator\Paginator; 

use Zend\Db; 
use Zend\Db\Sql; 
use Zend\Db\Sql\Select; 
use Zend\Db\Sql\Expression; 
use Zend\Db\TableGateway\TableGateway; 
use Zend\Db\Metadata\Metadata; 
use Zend\Db\Sql\Predicate; 
use Zend\Db\Sql\Predicate\PredicateSet; 
use Zend\Db\ResultSet\ResultSet; 

использование Front \ Model \ MAH;

В чем проблема?

Спасибо

меня написать тест:

public function searchSitesDeliveries($username, Search $search) 
{ 
     if (!empty($search->get_shipment_number())) 
     { 
      $valeur = $search->get_shipment_number(); 
      if(is_array($valeur)) 
      { 
       $toto = array(); 
       $valeur = array_unique($valeur); 
       $select = $this->tableGateway->getSql()->select(); 
       $titi = "$" ; 
       $compteur = 0; 
       foreach ($valeur as $key => $value) 
       {      
        $toto[$compteur] = $value; 
        $compteur = $compteur + 1; 
       } 
       for ($i=0; $i < ($compteur); $i++) { 
        \Zend\Debug\Debug::dump($toto[$i]); 
        if($i== 0 || $i == $compteur) 
        { 
         $titi = $titi . "select->where->equalTo('user_name', '".$username."')->next->like('shipment_number','".$toto[$i]."')";  
        } 
        else 
        {      
         $titi = $titi . "->or->like('shipment_number','".$toto[$i]."')->unnest;"; 
        } 
       } 
       \Zend\Debug\Debug::dump($titi);    
       $resultSet = $this->tableGateway->selectWith(eval($titi)); 
      } 
     } 
     return $resultSet; 
} 

Но:

string(173) "$select->where->equalTo('user_name', 'toto')->next->like('shipment_number','20151125056269')->or->like('shipment_number','20151014048501')->unnest;" 

и:

Message error : Not nested 
+0

Вы, вероятно, есть ошибка в вашем коде как $ predicate_set не определен. Но если вы посмотрите на классы zend-db, класс Predicate расширяет PredicateSet и определяет методы nest() и unnest(). –

+0

Как это исправить? –

+0

Вы можете исправить, как говорит новичок. Лично, вместо использования класса PredicateSet я использую класс Predicate (или Where, это то же самое). –

ответ

0

Это динамическое решение:

use Zend\Db\Sql\Where; 

public function searchSitesDeliveries($username, Search $search) 
{ 
    if (!empty($search->get_shipment_number())) 
    { 
     $valeur = $search->get_shipment_number(); 
     if(is_array($valeur)) 
     { 
      $result = array(); 
      $valeur = array_unique($valeur); 
      $where = new Where(); 
      $where->equalTo('username', $username); 
      if (!empty($valeur) { 
        $where->nest(); 
        $or = false; 
       foreach ($valeur as $value) 
       { 
         if ($or) $where->or; 
        $where->like('shipment_number', $value) 
        $or = true; 
       } 
       $where->unnest(); 
      } 
      $select = $this->tableGateway->getSql()->select();    
      $select->where($where); 
      $resultSet = $this->tableGateway->selectWith($select); 
      return $resultSet; 
     } 
     // error processing ... when $valeur isn't an array 
    } 
    // error processing ... when get_shipment_number is empty 
} 
0

Этот пример еще проще

$select->where->equalTo('user_name', $userName) 
    ->nest() 
     ->like('shipment_number', '20151106052811') 
     ->or 
     ->like('shipment_number', '20151110053250') 
     ->or 
     ->like('shipment_number', '20151116054359') 
    ->unnest() 

Если вы хотите использовать Predicate «s

$predicate = new Predicate\PredicateSet(
    [ 
     new Predicate\Operator('user_name', Predicate\Operator::OPERATOR_EQUAL_TO, $userName), 
     new Predicate\PredicateSet(
      [ 
       new Predicate\Like('shipment_number', '20151106052811'), 
       new Predicate\Like('shipment_number', '20151110053250'), 
       new Predicate\Like('shipment_number', '20151116054359'), 
      ], 
      Predicate\Predicate::COMBINED_BY_OR 
    ], 
    Predicate\Predicate::COMBINED_BY_AND 
); 
$select->where->addPredicate($predicate); 
0

Я думаю, что ответ @newage является хорошим, но, может быть, вы можете использовать в SQL заявление, как этот

SELECT * 
FROM vw_my_asn_header 
WHERE username = 'toto' 
    AND shipment_number IN ('20151106052811', '20151110053250', '20151116054359')  
ORDER BY message_id ASC 

С Зенд \ Db Вы можете использовать

new Predicate\In('shipment_number',array('20151106052811', '20151110053250', '20151116054359')) 
0

Я делаю это солью , он работает, но мне не нравится мой код, потому что он статичен, если у кого-то есть подсказка, чтобы сделать его динамичным, мне интересно.

public function searchSitesDeliveries($username, Search $search) 
{ 
    if (!empty($search->get_shipment_number())) 
    { 
     $valeur = $search->get_shipment_number(); 
     if(is_array($valeur)) 
     { 
      $result = array(); 
      $valeur = array_unique($valeur); 
      $compteur = 0; 
      foreach ($valeur as $key => $value) 
      { 
       $compteur = $compteur + 1;        
       $result[$compteur] = $value; 
      } 
      $select = $this->tableGateway->getSql()->select(); 
      switch($compteur) 
      { 
       case '1': 
        $predicate_set = new Predicate\PredicateSet(array(new Predicate\Expression('username = ?', $username)), Predicate\PredicateSet::COMBINED_BY_AND); 
        $predicate_set->andPredicate(new Predicate\Like('shipment_number', '%'.$valeur.'%')); 
        $select->where($predicate_set); 
       break; 
       case '2': 
        $select->where->equalTo('username', $username) 
        ->nest() 
         ->like('shipment_number', ''.$result[1].'') 
         ->or 
         ->like('shipment_number', ''.$result[2].'') 
        ->unnest(); 
       break; 
       case '3': 
        $select->where->equalTo('username', $username) 
        ->nest() 
         ->like('shipment_number', ''.$result[1].'') 
         ->or 
         ->like('shipment_number', ''.$result[2].'') 
          ->or 
         ->like('shipment_number', ''.$result[3].'') 
        ->unnest(); 
       break; 
       case '4': 
        $select->where->equalTo('username', $username) 
        ->nest() 
         ->like('shipment_number', ''.$result[1].'') 
         ->or 
         ->like('shipment_number', ''.$result[2].'') 
         ->or 
         ->like('shipment_number', ''.$result[3].'') 
         ->or 
         ->like('shipment_number', ''.$result[4].'') 
        ->unnest(); 
       break; 
       case '5': 
        $select->where->equalTo('username', $username) 
        ->nest() 
         ->like('shipment_number', ''.$result[1].'') 
         ->or 
         ->like('shipment_number', ''.$result[2].'') 
         ->or 
         ->like('shipment_number', ''.$result[3].'') 
         ->or 
         ->like('shipment_number', ''.$result[4].'') 
         ->or 
         ->like('shipment_number', ''.$result[5].'') 
        ->unnest(); 
       break; 
       case '6': 
       $select->where->equalTo('username', $username) 
        ->nest() 
         ->like('shipment_number', ''.$result[1].'') 
         ->or 
         ->like('shipment_number', ''.$result[2].'') 
         ->or 
         ->like('shipment_number', ''.$result[3].'') 
         ->or 
         ->like('shipment_number', ''.$result[4].'') 
         ->or 
         ->like('shipment_number', ''.$result[5].'') 
         ->or 
         ->like('shipment_number', ''.$result[6].'') 
        ->unnest(); 
       break; 
       case '7': 
        $select->where->equalTo('username', $username) 
        ->nest() 
         ->like('shipment_number', ''.$result[1].'') 
         ->or 
         ->like('shipment_number', ''.$result[2].'') 
         ->or 
         ->like('shipment_number', ''.$result[3].'') 
         ->or 
         ->like('shipment_number', ''.$result[4].'') 
         ->or 
         ->like('shipment_number', ''.$result[5].'') 
         ->or 
         ->like('shipment_number', ''.$result[6].'') 
         ->or 
         ->like('shipment_number', ''.$result[7].'') 
        ->unnest(); 
       break; 
       case '8': 
        $select->where->equalTo('username', $username) 
        ->nest() 
         ->like('shipment_number', ''.$result[1].'') 
         ->or 
         ->like('shipment_number', ''.$result[2].'') 
         ->or 
         ->like('shipment_number', ''.$result[3].'') 
         ->or 
         ->like('shipment_number', ''.$result[4].'') 
         ->or 
         ->like('shipment_number', ''.$result[5].'') 
         ->or 
         ->like('shipment_number', ''.$result[6].'') 
         ->or 
         ->like('shipment_number', ''.$result[7].'')        
         ->or 
         ->like('shipment_number', ''.$result[8].'') 
        ->unnest(); 
       break; 
       case '9': 
        $select->where->equalTo('username', $username) 
        ->nest() 
         ->like('shipment_number', ''.$result[1].'') 
         ->or 
         ->like('shipment_number', ''.$result[2].'') 
         ->or 
         ->like('shipment_number', ''.$result[3].'') 
         ->or 
         ->like('shipment_number', ''.$result[4].'') 
         ->or 
         ->like('shipment_number', ''.$result[5].'') 
         ->or 
         ->like('shipment_number', ''.$result[6].'') 
         ->or 
         ->like('shipment_number', ''.$result[7].'')        
         ->or 
         ->like('shipment_number', ''.$result[8].'') 
         ->or 
         ->like('shipment_number', ''.$result[9].'') 
        ->unnest(); 
       break; 
      } 
      $resultSet = $this->tableGateway->selectWith($select); 
     } 

    } 
    return $resultSet; 
} 
0
if(is_array($valeur)) { 
    $nest = false; 
    $valeur = array_unique($valeur); 

    /* Select */ 
    $select = $this->tableGateway->getSql()->select(); 
    $where = $select->where('user_name', $userName); 

    /* Open nest if $valuer has more 1 values */ 
    if ($nest === false && count($valuer) > 1) { 
     $nest = true; 
     $where = $where->nest(); 
    } 

    /* Add like and or to where */ 
    while (count($valuer) > 0) { 
     $value = array_shift($valuer); 
     $where = $where->like('shipment_number', $value); 
     if (count($valuer) > 0) { 
      $where = $where->or; 
     } 
    } 

    /* Close nest */ 
    if ($nest === true && empty($valuer)) { 
     $where->unnest(); 
    } 
}