Zend SELECT->WHERE 在 Array 的每个键上使用 LIKE

Zend SELECT->WHERE using LIKE on each key of Array

我不确定如何用英文表达,所以这里是 SQL:

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。

我很好奇这是怎么做到的。提前致谢。

如果我理解你:制作所需对象的数组,并将该数组传递给查询

$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
    );