php - symfony2 - Cómo configurar una entidad(doctrina) para la vista de base de datos en Symfony 2
findoneby (5)
Además de la respuesta anterior, he mezclado parte de su código de ejemplo para extender DoctrineUpdateCommand
Este es mi 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);
}
}
Gracias por el camino correcto
Digamos que tengo una tabla de vista. Y quiero obtener datos de ella a una entidad. ¿Puedo (y cómo) crear una clase de entidad para hacer eso? (no se necesita operación de guardado). Sólo quiero mostrarlos.
Además de las respuestas anteriores, si está utilizando migraciones de doctrina para la actualización de esquemas, la siguiente configuración funciona perfectamente.
/**
* @ORM/Entity(readOnly=true)
* @ORM/Table(name="view_table_name")
*/
class YourEntity {
private function __construct() {}
}
Hasta aquí es igual que las respuestas anteriores. Aquí necesitas configurar la doctrina para no enlazar esquemas;
doctrine:
dbal:
schema_filter: ~^(?!view_)~
La definición de filtro anterior filtra todas las tablas con el prefijo ''ver_'', así como las vistas que podrían extenderse usando expresiones regulares. Solo asegúrese de haber nombrado sus vistas con el prefijo ''ver_''.
Pero la doctrina: esquema: actualización --dump-sql todavía muestra las vistas, espero que también integren el mismo filtro en la actualización del esquema.
Espero que esta solución ayude a algunos otros.
Fuente: http://symfony.com/doc/current/bundles/DoctrineMigrationsBundle/index.html#manual-tables
La respuesta aceptada es correcta, pero me gustaría ofrecer algunas sugerencias adicionales que quizás desee considerar:
Marca tu entidad como de solo lectura.
Haz que el constructor sea privado para que solo Doctrine pueda crear instancias.
/**
* @ORM/Entity(readOnly=true)
* @ORM/Table(name="your_view_table")
*/
class YourEntity {
private function __construct() {}
}
Las dos respuestas anteriores son correctas, pero si utiliza la herramienta de migración de doctrina y hace un schema:update
fallará ...
Entonces, además de marcar la entidad como de solo lectura y hacer que el constructor sea privado (explicado en la respuesta de Ian Phillips):
/**
* @ORM/Entity(readOnly=true)
* @ORM/Table(name="your_view_table")
*/
class YourEntity {
private function __construct() {}
}
Necesitaría configurar la herramienta de esquema para ignorar la entidad al hacer un esquema: actualizar ...
Para hacer eso, solo necesita crear este comando en su paquete y establecer su entidad en la lista de entidades ignoradas:
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);
}
}
(Crédito a Alexandru Trandafir Catalin: obtenido de aquí: https://.com/a/25948910/1442457 )
Por cierto, esta es la única manera que encontré para trabajar con puntos de vista de la doctrina ... Sé que es una solución alternativa ... Si hay una forma mejor en que estoy abierto o sugerencias)
No hay nada especial en consultar una vista, es solo una tabla virtual. Coloca la tabla de tu entidad de esta manera y disfruta:
/**
* @ORM/Entity
* @ORM/Table(name="your_view_table")
*/
class YourEntity {
// ...
}