Как настроить сущность (доктрину) для представления базы данных в Symfony 2 - PullRequest
19 голосов
/ 04 декабря 2011

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

Ответы [ 5 ]

26 голосов
/ 25 января 2016

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

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

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

/**
 * @ORM\Entity(readOnly=true)
 * @ORM\Table(name="your_view_table")
 */
class YourEntity {
    private function __construct() {}
}
18 голосов
/ 05 июля 2016

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

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

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

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

Для того, чтобы сделатьчто вам просто нужно создать эту команду в вашем комплекте и установить свою сущность в списке 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);
  }

}

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

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

17 голосов
/ 05 декабря 2011

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

/**
 * @ORM\Entity
 * @ORM\Table(name="your_view_table")
 */
class YourEntity {
    // ...
}
9 голосов
/ 13 апреля 2017

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

/**
 * @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

1 голос
/ 27 октября 2017

В дополнение к ответу, приведенному выше, я смешал часть вашего примера кода для расширения 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);
 }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...