Как настроить объект (доктрину) для представления базы данных в Symfony 2

Допустим, у меня есть таблица представлений. И я хочу получить данные от него к сущности. Могу ли я (и как) создать класс сущности для этого. (не требуется операция сохранения). Я просто хочу их отобразить.

В запросе нет ничего особенного – это просто виртуальная таблица. Установите таблицу своего объекта таким образом и наслаждайтесь:

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

Принятый ответ правильный, но я хотел бы предложить некоторые дополнительные предложения, которые вы можете рассмотреть:

Отметьте свою сущность как доступную только для чтения.

Сделайте конструктор частным, так что только Doctrine может создавать экземпляры.

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

Оба предыдущих ответа верны, но если вы используете инструмент миграции доктрины и выполните schema:update не получится …

Таким образом, помимо маркировки объекта как только для чтения и создания частного конструктора (объясняется в ответе Иана Филлипса):

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

Вам нужно будет установить инструмент схемы для игнорирования объекта при выполнении схемы: update …

Для этого вам просто нужно создать эту команду в своем пакете и установить объект yout в списке ignoredEntity:

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

(кредит Александру Трандафиру Каталину: полученный отсюда: https://stackoverflow.com/a/25948910/1442457 )

BTW, это единственный способ, которым я нашел работу с представлениями из доктрины … Я знаю, что это обходной путь … Если есть лучший способ, я открыт или предложения)

В дополнение к вышеперечисленным, если вы используете миграции doctrine для обновления схемы, следующая конфигурация работает отлично.

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

До сих пор те же, что и выше. Здесь вам нужно настроить доктрину, чтобы она не привязывала схемы;

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

Вышеуказанное определение фильтра фильтрует все префиксные таблицы «view_», а также представления, которые могут быть расширены с помощью регулярного выражения. Просто убедитесь, что вы назвали свои представления префиксом «view_».

Но doctrine: schema: update –dump-sql все еще показывает представления, я надеюсь, что они тоже будут интегрировать один и тот же фильтр в обновление схемы.

Надеюсь, это решение поможет другим.

Источник: http://symfony.com/doc/current/bundles/DoctrineMigrationsBundle/index.html#manual-tables

В дополнение к вышеуказанному ответу, я смешал некоторые из вашего примера кода, чтобы расширить DoctrineUpdateCommand

Это мой 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); } } 

Спасибо за правильный путь