Zend Framework: как включить оператор OR в SQL fetchAll () - PullRequest
2 голосов
/ 18 января 2010

Я пытаюсь построить следующий оператор 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 выбора и объединить результаты (много дополнительных издержек?) ?

PS Прошедший параметр $like очищается, поэтому не нужно беспокоиться о вводе пользователемв коде выше!

Ответы [ 3 ]

4 голосов
/ 18 января 2010
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 голосов
/ 18 января 2010

Zend_Db_Select имеет функцию orWhere. Вы должны быть в состоянии решить вашу проблему с ним.

0 голосов
/ 25 марта 2010

Вы также можете вкладывать операторы OR, используя двойные кавычки ("):

$ select-> where ('users_table.username LIKE '"%". $ like1.'% "'ИЛИ users_data.first_name LIKE '"%". $ Like2.'% "'ИЛИ users_data.last_name LIKE '"%". $ Like3.'% "');

Что работает лучше, когда вы создаете sql, включая также И, например:

выберите X из Y, где A = AAA и (B = BBB или C = CCC илиD = DDD)

...