Zend Framework:如何在SQL fetchAll()中包含OR语句

时间:2010-01-18 15:10:17

标签: zend-framework zend-db zend-db-table

我正在尝试构建以下SQL语句:

SELECT `users_table`.*, `users_data`.`first_name`, `users_data`.`last_name`
FROM `users_table`
INNER JOIN `users_data` ON users_table.id = user_id
WHERE (users_table.username LIKE '%sc%')
OR (users_data.first_name LIKE '%sc%')
OR (users_data.last_name LIKE '%sc%')

目前我有以下代码:

public function findAllUsersLike($like) {
    $select = $this - > select(Zend_Db_Table::SELECT_WITH_FROM_PART) - > setIntegrityCheck(false);
    $select - > where('users_table.username LIKE ?', '%'.$like.'%');
    $select - > where('users_data.first_name LIKE ?', '%'.$like.'%');
    $select - > where('users_data.last_name LIKE ?', '%'.$like.'%');
    $select - > join('users_data', 'users_table.id = user_id', array('first_name', 'last_name'));
    return $this - > fetchAll($select);
}

这很接近,但不正确,因为它使用AND添加额外的WHERE语句,而不是OR

有没有办法做这个选择?或者我应该执行3次选择并合并结果(很多开销?)

P.S。过去的参数$like已经过清理,所以不需要了解上面代码中的用户输入!

3 个答案:

答案 0 :(得分:4)

public function findAllUsersLike($like) {
    $select = $this->select(Zend_Db_Table::SELECT_WITH_FROM_PART)->setIntegrityCheck(false);
    $select->orWhere('users_table.username LIKE ?', '%'.$like.'%');
    $select->orWhere('users_data.first_name LIKE ?', '%'.$like.'%');
    $select->orWhere('users_data.last_name LIKE ?', '%'.$like.'%');
    $select->join('users_data', 'users_table.id = user_id', array('first_name', 'last_name'));
    return $this->fetchAll($select);
}

答案 1 :(得分:2)

Zend_Db_Select有一个函数orWhere。你应该能用它来解决你的问题。

答案 2 :(得分:-1)

您还可以使用双引号(“)来嵌套OR语句:

  

$选择 - 化合物其中('
  users_table.username LIKE'“%'。$ like1。'%''
  OR users_data.first_name LIKE'“%'。$ like2。'%''
  OR users_data.last_name LIKE'“%'。$ like3。'%''
  );

当您创建包含AND之类的sql时,哪种方法更有效:

  

从Y中选择X,其中A = AAA且(B = BBB或C = CCC或D = DDD)