2012-10-28 35 views
5

Trong ZF1 nó làm việc như thế này:Zend Framework 2: sql subquery

$selectColumns = array(
    '*', 
    'orders_total' => "(".$db->select()->from("orders", array("COUNT(*)"))->where("orders.parent_id=mytable.id").")", 
); 
$select = $db->select()->from('mytable', $selectColumns); 

Làm thế nào để làm điều này trong ZF2? Cảm ơn.

Trả lời

7

Hãy thử điều này.

$sql = new Sql($this->_adapter); 
$mainSelect = $sql->select()->from('mytable'); 
$subQry = $sql->select() 
     ->from('orders') 
     ->columns(array('orderCount' => new \Zend\Db\Sql\Expression('COUNT(orders.id)'))); 
$mainSelect->columns(
     array(
      'id', 
      'orders_total' => new \Zend\Db\Sql\Expression('?', array($subQry)), 
     ) 
); 

$statement = $sql->prepareStatementForSqlObject($mainSelect); 
$comments = $statement->execute(); 
$resultSet = new ResultSet(); 
$resultSet->initialize($comments); 

return $resultSet->toArray(); 

Link: ZF2 - subqueries

0

Nếu không có bất kỳ thông tin hơn, bạn có thể thử:

$selectColumns = array(
    '*', 
    'orders_total' => "(".$db->select()->from("orders", array("COUNT(*)"))->where("orders.parent_id", "mytable.id").")", 
); 
$select = $db->select()->from('mytable', $selectColumns); 

Bạn sẽ cần thêm ít nhất với những điều khoản sử dụng:

use Zend\Db\Sql\Select; 
use Zend\Db\Sql\Where; 
1

Bạn có thể thử này:

// Make your query here using the builder if you wish, 
// but we will need to convert to string for the Expression 
$sub = new Select('orders'); 
$sub->columns(array(new Expression('COUNT(*) as total'))) 
    ->where(array('id' => 4)) 
; 
// You could just create an expression.. 
$subquery = new \Zend\Db\Sql\Expression("({$sub->getSqlString()})"); 

$select = new \Zend\Db\Sql\select('tablename'); // this is inside a 

$select->columns(array('*', 'orders_total' => $subquery)); 

đầu ra sẽ có dạng như sau:

SELECT 
    .*, 
    (SELECT COUNT(*) as total FROM "orders" WHERE "id" = '4') AS orders_total 
FROM tablename 

Tôi chưa tìm ra cách hay để sử dụng trình tạo truy vấn để thực hiện các loại truy vấn này mà không phải sử dụng truy vấn thô.

0

Bạn có thể thử tái cấu trúc SQL của bạn để một cái gì đó như:

SELECT 
    *, 
    SUM(IF(O.parent_id IS NULL, 0, 1)) AS orders_total 
FROM mytable 
    LEFT JOIN orders O ON mytable.id = O.parent_id 

nào bạn có thể đại diện cho sử dụng Zend Framework 2 như:

$select = new Select('mytable'); 
$select->columns(array(
    '*', 
    'orders_total' => new Expression("SUM(IF(O.parent_id IS NULL, 0, 1))") 
)); 
$select->join(array('O', 'orders'), 
       "mytable.id = O.parent_id", 
       Select::JOIN_LEFT); 
$select->group(array('mytable.id')); 

$result = $dbh->selectWith($select); 

Giả sử $ dbh là bộ điều hợp cơ sở dữ liệu của bạn.