ti-enxame.com

Como configurar entidade (doutrina) para a visualização do banco de dados no Symfony 2

Vamos dizer que tenho uma mesa de visualização. E eu quero obter dados dele para uma entidade. Eu posso (e como) criar classe de entidade para fazer isso. (Nenhuma operação de salvamento necessária). Eu só quero exibi-los.

21
user1063963

Não há nada de especial para consultar uma visão - é apenas uma mesa virtual. Defina a tabela de sua entidade dessa maneira e aproveite:

/**
 * @ORM\Entity
 * @ORM\Table(name="your_view_table")
 */
class YourEntity {
    // ...
}
19
Elnur Abdurrakhimov

A resposta aceita é correta, mas gostaria de oferecer algumas sugestões adicionais que você pode querer considerar:

Marque sua entidade como somente leitura.

Faça o construtor privado para que apenas Doctrine possa criar instâncias.

/**
 * @ORM\Entity(readOnly=true)
 * @ORM\Table(name="your_view_table")
 */
class YourEntity {
    private function __construct() {}
}
31
Ian Phillips

Ambas as respostas anteriores estão corretas, mas se você usar a ferramenta de migração doctrine e fazer um schema:update vai falhar ...

Então, além de marcar a entidade como leitura apenas e tornar o construtor privado (explicado em Ian Phillips Resposta):

/**
 * @ORM\Entity(readOnly=true)
 * @ORM\Table(name="your_view_table")
 */
class YourEntity {
    private function __construct() {}
}

Você precisaria definir a ferramenta Schema para ignorar a entidade ao fazer um esquema: atualizar ...

Para fazer isso você só precisa criar este comando em seu pacote, e definir sua entidade na lista Ignoredentity:

sRC/Acme/CoreBundle/Comando/DoctrineUpDateCommand.php:

<?php

namespace Acme\CoreBundle\Command;

use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Doctrine\ORM\Tools\SchemaTool;

class DoctrineUpdateCommand extends \Doctrine\Bundle\DoctrineBundle\Command\Proxy\UpdateSchemaDoctrineCommand {

  protected $ignoredEntities = array(
      'Acme\CoreBundle\Entity\EntityToIgnore'
  );

  protected function executeSchemaCommand(InputInterface $input, OutputInterface $output, SchemaTool $schemaTool, array $metadatas) {

    /** @var $metadata \Doctrine\ORM\Mapping\ClassMetadata */
    $newMetadatas = array();
    foreach ($metadatas as $metadata) {
      if (!in_array($metadata->getName(), $this->ignoredEntities)) {
        array_Push($newMetadatas, $metadata);
      }
    }

    parent::executeSchemaCommand($input, $output, $schemaTool, $newMetadatas);
  }

}

(Crédito para Alexandru Trandafir Catalin: Obtido daqui: https://stackoverflow.com/a/25948910/1442457 )

BTW, esta é a única maneira que eu encontrei para trabalhar com vistas da doutrina ... Eu sei que é uma solução alternativa ... se houver uma maneira melhor, estou aberto ou sugestões)

18
Alex Mantaut

Além de acima adegas se você estiver usando doctrine Migrações para atualização do esquema, a configuração a seguir funciona perfeitamente.

/**
 * @ORM\Entity(readOnly=true)
 * @ORM\Table(name="view_table_name")
 */
class YourEntity {
    private function __construct() {}
}

Até aqui é o mesmo que acima respostas. Aqui você precisa configurar doctrine para não ligar esquemas;

doctrine:
    dbal:
        schema_filter: ~^(?!view_)~

Os filtros de definição de filtro acima, todas as mesas prefixadas 'View_', bem como visualizações, pode ser estendida usando regex. Apenas certifique-se de ter nomeado suas visualizações com prefixo 'View_'.

Mas Doctrina: Esquema: Atualização - DUMPUM-SQL Ainda mostra as visualizações, espero que elas integrem o mesmo filtro ao esquema atualização também.

Espero que esta solução ajudasse a outros.

Fonte: http://symfony.com/doc/current/bundles/doctrinemigraçõesBundle/index.html#manual-Tables

10
bekco

Além de acima da resposta, misturei um pouco do seu código de exemplo para estender o DoctrineUpDateCommand

Este é o meu doutrineupdateCommand:

class DoctrineUpdateCommand extends UpdateSchemaDoctrineCommand{
   protected function executeSchemaCommand(InputInterface $input, OutputInterface $output, SchemaTool $schemaTool, array $metadatas) {
      $container = $this->getApplication()->getKernel()->getContainer();  

     $filterExpr = $container->get('doctrine')->getEntityManager()->getConnection()->getConfiguration()->getFilterSchemaAssetsExpression();
     $emptyFilterExpression = empty($filterExpr);

     /** @var $newMetadatas \Doctrine\ORM\Mapping\ClassMetadata */
     $newMetadatas = array();

     foreach ($metadatas as $metadata) {
        if(($emptyFilterExpression||preg_match($filterExpr, $metadata->getTableName()))){
            array_Push($newMetadatas, $metadata);
        }        
     }

     parent::executeSchemaCommand($input, $output, $schemaTool, $newMetadatas);
 }
}

Obrigado pelo caminho certo

1
sebastien hupin

Além disso, você deve ter uma estratégia de nomeação de suas entidades de visualização e as tabelas virtuais, por exemplo: View_your_table e, em seguida, você deve adicionar o seguinte código à doutrina.yaml, para desativar a criação de novo arquivo de migração para a exibição : schema_filter: ~^(?!view_)~

0
Shadi Akil