如何使用Laminas sql like运算符构建复杂的查询?

问题描述

嗨,我用Laminas Sql类创建了一个SQL查询。

$sql = new Sql($this->adapter);
$select = $sql->select();
$select->from('users');
$select->columns([
    'user_id',]);
$nest = $select->where('account_type_id','dr')
    ->where->nest()
    ->nest();
 $nest
    ->like('firstname','%john%')
    ->or->like('firstname','%james%')
    ->or->like('firstname','%brown%')
    ->unnest()  // bracket closed
    ->or
    ->nest()
    ->like('lastname','%john%')
    ->or->like('lastname','%james%')
    ->or->like('lastname','%brown%')
    ->unnest()
    ->unnest(); 
   echo $select->getSqlString($this->adapter->getPlatform());

上面的查询输出如下。

SELECT `users`.`user_id` AS `user_id` FROM `users` WHERE account_type_id AND 
(
(`firstname` LIKE '%john%' OR `firstname` LIKE '%james%' OR `firstname` LIKE '%brown%') OR (`lastname` LIKE '%john%' OR `lastname` LIKE '%james%' OR `lastname` LIKE '%brown%')
)

但是我想用foreach循环创建它。我喜欢尝试,

    $sql = new Sql($this->adapter);
    $select = $sql->select();
    $select->from('users');
    $select->columns([
        'user_id',]);
    $nest = $select->where('account_type_id','dr')
        ->where->nest()
        ->nest();
    $names = ['%john%','%james%','%brown%'];
    foreach ($names as $val) {
        $nest = $nest
            ->or->like('firstname',$val)
            ->unnest()
            ->or
            ->nest()
            ->or->like('lastname',$val);
    }
    $nest = $nest->unnest();
    echo $select->getSqlString($this->adapter->getPlatform());

但是输出不符合我的预期。

SELECT `users`.`user_id` AS `user_id` FROM `users` WHERE account_type_id AND (
(`firstname` LIKE '%john%') 
OR (`lastname` LIKE '%john%' OR `firstname` LIKE '%james%') 
OR (`lastname` LIKE '%james%' OR `firstname` LIKE '%brown%') OR (`lastname` LIKE '%brown%')
)

我非常感谢您能提供的任何帮助。 谢谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)