Zend Framework 2 Sql Выберите с помощью ИЛИ и И

Я хочу сделать этот запрос, используя Zend\Db\Sql\Select:

SELECT table1.* FROM table1 
    INNER JOIN table2 ON table1.columnA = table2.columnB 
    INNER JOIN table3 ON table1.columnC = table3.columnD

WHERE (table2.column2 = 2 or table3.column3 = 3) and table1.column1 = 1

ORDER BY table1.columnE ASC LIMIT 1

У меня есть этот код до сих пор:

/*@var $db Adapter */
$db = $this->getServiceLocator()->get('db');
$sql = new Sql($db);
$select = $sql->select();

$select->from('table1');
$select->join('table2','table1.columnA = table2.columnB',array());
$select->join('table3','table1.columnC = table3.columnD',array());

$select->where(array('table2.column2' => 2, 'table2.column3' => 3), Predicate\PredicateSet::OP_OR);

$select->where(array('table1.column1' => 1),Predicate\PredicateSet::OP_AND);

$select->order('table1.columnE ASC');
$select->limit(1);

$statement = $sql->prepareStatementForSqlObject($select);
$resultSet = $statement->execute();

Но не работает, потому что создайте это (без "(" и ")" для ИЛИ):

SELECT table1.* FROM table1 
    INNER JOIN table2 ON table1.columnA = table2.columnB 
    INNER JOIN table3 ON table1.columnC = table3.columnD

WHERE table2.column2 = 2 or table3.column3 = 3 and table1.column1 = 1

ORDER BY table1.columnE ASC LIMIT 1

Что я могу сделать?


person leticia    schedule 21.06.2013    source источник


Ответы (2)


с самого начала, используя интерфейс Where fluent:

$select->where
       ->nest
           ->equalTo('table2.column2', 2)
           ->or
           ->equalTo('table2.column3', 3)
       ->unnest
       ->and
       ->equalTo('table1.column1', 1);
person Xerkus    schedule 22.06.2013
comment
Спасибо, я использовал создание $where = new \Zend\Db\Sql\Where(); но это тоже отлично работает. - person leticia; 24.06.2013
comment
@gsc-leticia этот пример переопределит любые уже существующие условия, поскольку $select->where($where) полностью заменяет объект Where. Кроме того, ненужное создание дополнительного объекта является крошечным, но эффективным ударом. - person Xerkus; 24.06.2013
comment
Вы правы, все работает нормально, и это решение более простое. - person leticia; 24.06.2013

Я бы сделал что-то вроде:

$where = new \Zend\Db\Sql\Where();

$where
    ->nest()
    ->equalTo('table2.column2', 2)
    ->or
    ->equalTo('table2.column3', 3)
    ->unnest()
    ->and
    ->equalTo('table1.column1', 1);
$select->where($where)

Просто потому, что таким образом ваш $select остается реализацией Zend\Db\Sql\SqlInterface при выполнении

$select->where
   ->nest

вернет экземпляр оператора Zend Sql. Что не плохо, но тогда вы не можете просто сделать

$statement = $sql->prepareStatementForSqlObject($select);
$resultSet = $statement->execute();
person Delio    schedule 22.06.2013
comment
Кстати, используя другое решение, которое я мог бы использовать: $sql->prepareStatementForSqlObject($select); и $resultSet = $statement->execute(); без проблем. - person leticia; 25.06.2013