Meu nome é Elton Minetto

Subqueries no Zend Framework 2

zend framework 2

Essa dica veio do amigo Romulo Busatto, de uma forma de criar subqueries usando o componente Zend\Db do Zend Framework 2.

No controller vamos usar o Zend\Db\Sql para criar as consultas:

<?php
namespace Application\Controller;
 
use Zend\View\Model\ViewModel;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\Db\Sql\Sql;
use Zend\Db\Sql\Expression;

/**
 * Controlador exemplo
 * 
 * @category Application
 * @package Controller
 * @author  Elton Minetto <eminetto@coderockr.com>
 */
class IndexController extends AbstractActionController
{

    /**
     * Exemplo de uso de sub queries
     * @return void
     */
    public function indexAction()
    {
        //adapter configurado no ServiceManager
        $adapter = $this->getServiceLocator()->get('DbAdapter');
        $sql = new Sql($adapter);
        $mainSelect = $sql->select()->from('comments');
        $selectPost = $sql->select()
                          ->from('posts')
                          ->columns(array('title'))
                          ->where('id = post_id');
        $mainSelect->columns(
            array(
                'description',
                'name',
                'comment_date',
                'post_title' => new Expression('?',array($selectPost)),
                
            )
        );        

        $statement = $sql->prepareStatementForSqlObject($mainSelect);
        $comments = $statement->execute();
        
        return new ViewModel(array(
            'comments' => $comments
        ));

    }
}

A consulta que será gerada, no MySQL, é:

SELECT "comments"."description" AS "description", 
       "comments"."name" AS "name", 
       "comments"."comment_date" AS "comment_date", 
      (SELECT "posts"."title" AS "title" FROM "posts" WHERE id = post_id) AS "post_title" 
FROM "comments"

E finalmente, na view vamos ter acesso aos dados e podemos usá-los normalmente:

<?php foreach ($this->comments as $c): ?>
  <?php echo $c['post_title'];?> -  <?php echo $c['description'];?> - <?php echo $c['comment_date'];?> <br>

<?php endforeach;?>

Esse é um exemplo bem simples, mas dá para expandir e criar coisas mais complexas com isso.

Mais informações sobre o Zend\Db\Sql podem ser encontradas no manual do framework e se você quer aprender mais sobre o Zend Framework 2 confira o curso no Code Squad ou o e-book Zend Framework 2 na prática