2017-02-10 9 views
0

я не уверен, как поставить это на английском языке, поэтому здесь в SQL:Zend select-> WHERE с использованием LIKE на каждом ключе массива

SELECT "track_sub_genre".* FROM "track_sub_genre" 
WHERE "track_sub_genre"."name" LIKE '%rock punk%' 
OR ("track_sub_genre"."name" LIKE '%rock%' AND "track_sub_genre"."name" LIKE '%punk%') 

SQL, выше генерируется этим кодом, однако есть проблема, которую я объясню ниже.

$keywords = 'rock punk'; 
$key_arr = explode(' ' , $keywords); 

if(count($key_arr) > 1) { 

    $select->where(new \Zend\Db\Sql\Predicate\Like('track_sub_genre.name', '%'.$keywords.'%')); 
    $select->where(
     new \Zend\Db\Sql\Predicate\PredicateSet(
      array(
       new \Zend\Db\Sql\Predicate\Like('track_sub_genre.name', '%'.$key_arr[0].'%'), 
       new \Zend\Db\Sql\Predicate\Like('track_sub_genre.name', '%'.$key_arr[1].'%'), 
      ), 
      \Zend\Db\Sql\Predicate\PredicateSet::OP_AND 
     ), 
     \Zend\Db\Sql\Predicate\PredicateSet::OP_OR 
    ); 

} else { 
    // Do not worry about this case 
} 

Проблема заключается в том, конечно, что я не буду знать, сколько слов я буду иметь в $key_arr, поэтому мне нужен динамический код, который будет генерировать этот SQL.

Мне действительно интересно, как это делается. Заранее спасибо.

ответ

1

, если я понимаю, что вы: Сделайте массив нужных объектов, и передать этот массив в запросе

$key_arr = explode(' ' , $keywords); 
$insert_arr = []; 
foreach ($key_arr as $value) { 

    $insert_arr[] = new \Zend\Db\Sql\Predicate\Like('track_sub_genre.name', '%'.$value.'%') 
} 

и в запросе

$select->where(
     new \Zend\Db\Sql\Predicate\PredicateSet(
      $insert_arr, 
      \Zend\Db\Sql\Predicate\PredicateSet::OP_AND 
     ), 
     \Zend\Db\Sql\Predicate\PredicateSet::OP_OR 
    ); 
+0

Это верно, так просто, и я не видел его , Спасибо! –

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

  • Нет связанных вопросов^_^