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
);
我不确定如何用英文表达,所以这里是 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
);