CHỈNH SỬA :Trên thực tế, bây giờ tôi thấy rằng truy vấn của tôi có sai sót. Nó sẽ không hoạt động như mong đợi với MySQL, có nghĩa là tôi vẫn phải viết các truy vấn chuyên biệt. Xem GROUP_CONCAT thay đổi GROUP THEO thứ tự
Sau khi xem qua mã của Zend\Db\Sql\Select
Tôi tìm thấy những dòng này:
if ($table instanceof Select) {
$table = '(' . $this->processSubselect($table, $platform, $driver, $parameterContainer) . ')';
} else {
$table = $platform->quoteIdentifier($table);
}
Vì vậy, câu trả lời thực sự khá đơn giản, tất cả những gì tôi phải làm là cung cấp Zend\Db\Sql\Select
đối tượng với from()
mà không cần gói nó trong một Zend\Db\Sql\Expression
như tôi đã từng làm với ZF1.
Ví dụ về mã:
$adapter = $this->getAdapter(); // Returns Zend\Db\Adapter\Adapter
$sql = new Zend\Db\Sql\Sql($adapter);
$from = $sql->select()
->from(static::$table)
->columns(array(
'full_name',
'value',
))
->order('id DESC');
$select = $sql->select()
->from(array(
'subtable' => $from,
))
->columns(array(
'full_name' => 'full_name',
'value' => new Expression('GROUP_CONCAT(value)'),
))
->group('full_name')
->order('full_name DESC');
$selectString = $sql->getSqlStringForSqlObject($select);
$resultSet = $adapter->query($selectString, $adapter::QUERY_MODE_EXECUTE);
return $resultSet->toArray();