代码之家  ›  专栏  ›  技术社区  ›  Scoobler

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

  •  2
  • Scoobler  · 技术社区  · 16 年前

    我正在尝试构建以下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 回复  |  直到 15 年前
        1
  •  4
  •   St.Woland    16 年前
    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);
    }
    
        2
  •  2
  •   Robin    16 年前

    Zend_Db_Select有一个功能 orWhere . 你应该能用它解决你的问题。

        3
  •  -1
  •   pzajdel    16 年前

    也可以使用双引号(“)嵌套或语句:

    $select->在哪里

    或用户_data.first_名称,如“%”、$like2.“%”
    或用户_data.last_name,如“%”、$like3.“%”

    当您创建sql时,哪一项效果更好,还包括:

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