How to set up entity (doctrine) for database view in Symfony 2

前端 未结 6 1351
心在旅途
心在旅途 2020-11-30 01:51

Lets say i have a view table. And i want to get data from it to an entity. Can i (and how) create entity class to do that. (no save operation needed). I just want to display

相关标签:
6条回答
  • 2020-11-30 02:29

    The accepted answer is correct, but I'd like to offer some additional suggestions that you might want to consider:

    Mark your entity as read-only.

    Make the constructor private so that only Doctrine can create instances.

    /**
     * @ORM\Entity(readOnly=true)
     * @ORM\Table(name="your_view_table")
     */
    class YourEntity {
        private function __construct() {}
    }
    
    0 讨论(0)
  • 2020-11-30 02:33

    In addition to above answer, I have mixed some of your example code to extend the DoctrineUpdateCommand

    This is my DoctrineUpdateCommand:

    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);
     }
    }
    

    Thanks for the right way

    0 讨论(0)
  • 2020-11-30 02:34

    There is nothing special in querying a view — it's just a virtual table. Set the table of your entity this way and enjoy:

    /**
     * @ORM\Entity
     * @ORM\Table(name="your_view_table")
     */
    class YourEntity {
        // ...
    }
    
    0 讨论(0)
  • 2020-11-30 02:35

    Both the previous answers are correct, but if you use the doctrine migration tool and do a schema:update it will fail...

    So, in addition to marking the entity as read only and making the constructor private (explained in Ian Phillips answer):

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

    You would need to set the schema tool to ignore the entity when doing a schema:update...

    In order to do that you just need to create this command in your bundle, and set yout entity in the ignoredEntity list:

    src/Acme/CoreBundle/Command/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);
      }
    
    }
    

    (credit to Alexandru Trandafir Catalin: obtained from here: https://stackoverflow.com/a/25948910/1442457)

    BTW, this is the only way I found to work with views from doctrine... I know it is a workaround... If there is a better way I am open or suggestions)

    0 讨论(0)
  • 2020-11-30 02:41

    In addition to above anwers if you are using doctrine migrations for schema update the following configuration works perfectly.

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

    Till here is te same as above answers. Here you need to configure doctrine not to bind schemas;

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

    The above filter definition filters all 'view_' prefixed tables as well as views an could be extended using regex. Just make sure you have named your views with 'view_' prefix.

    But doctrine:schema:update --dump-sql still shows the views, I hope they will integrate the same filter to schema update too.

    I hope this solution would help some others.

    Source: http://symfony.com/doc/current/bundles/DoctrineMigrationsBundle/index.html#manual-tables

    0 讨论(0)
  • 2020-11-30 02:51

    In addition to above answer, You must have a naming Strategy of your view' entities and the virtual tables, for example: view_your_table, and then you must add the following code to the doctrine.yaml, to disable creating new migration file to the view: schema_filter: ~^(?!view_)~

    0 讨论(0)
提交回复
热议问题