2017-11-24 186 views
7

Jak mogę zatrzymać symfony próbując utworzyć tabelę dla widoku, który utworzyłem podczas migracji doktryny?Jak zatrzymać doktrynę próbującą utworzyć tabelę dla widoku, który został odwzorowany na encji?

Podmiot mapowanie widok

/** 
* Class TenancyPendingInspection 
* @ORM\Entity(repositoryClass="DJABundle\PropertyVisit\Repository\TenancyPendingInspectionRepository", readOnly=true) 
* @ORM\Table(name="view_tenancies_pending_inspections") 
*/ 
class TenancyPendingInspection 
{ 

mam oraz plik migracji doktryną.

Doktryna Konfiguracja

doctrine: 
    dbal: 
     default_connection: default 
     connections: 
      default: 
       [...] 
       charset: UTF8 
       server_version:  5.6 
       schema_filter: ~^(?!view_)~ 

Doctirne schematu validate

php app/console doc:sch:val 
[Mapping] OK - The mapping files are correct. 
[Database] FAIL - The database schema is not in sync with the current mapping file. 

Doktryna zmiana schematu

php app/console doc:sch:update --dump-sql 
CREATE TABLE view_tenancies_pending_inspections ... 
+0

Próbowałem '/^(?! View _) /" 'i działało zgodnie z oczekiwaniami. Jaką wersję Doctrine-DBAL zainstalowałeś? – yceruto

+0

Skonfigurowałem go również bezpośrednio pod klawiszem 'dbal:'. – yceruto

+0

DBAL v2.5.13 Jak zrozumiałam, ten filtr zatrzymał DBAL przeglądając te tabele (view_ *), aby Doctrine próbował utworzyć tabelę cały czas. – albert

Odpowiedz

2

Krótka odpowiedź: To nie może być zrobione.

Dzieje się tak, ponieważ MysqlPlatform ignoruje widoki.

//vendor/doctrine/dbal/lib/Doctrine/DBAL/Platforms/MySqlPlatform.php 

class MySqlPlatform extends AbstractPlatform 
[...] 
    public function getListTablesSQL() 
    { 
     return "SHOW FULL TABLES WHERE Table_type = 'BASE TABLE'"; 
    } 
[...] 

Rozwiązanie: Utwórz nowy MysqlPlatform że nie ignoruje widoki:

class MysqlViewsPlatform extends \Doctrine\DBAL\Platforms\MySqlPlatform 
{ 
    public function getListTablesSQL() 
    { 
     return "SHOW FULL TABLES"; 
    } 
} 

utworzyć usługę ze swojej platformy:

services: 
    doctrine.dbal.mysql_views_platform: 
     class: albertsola\DoctrineViews\MysqlViewsPlatform 
     arguments: [] 

używać tej platformy z połączeniem:

doctrine: 
    dbal: 
     default_connection: default 
     connections: 
      default: 
       driver: "%database_driver%" 
       host:  "database_host%" 
       port:  "database_port%" 
       dbname: "database_name%" 
       user:  "database_user%" 
       password: "database_password%" 
       charset: UTF8 
       platform_service: "doctrine.dbal.mysql_views_platform" 

app/console doctrine: schema: validate To polecenie sprawdza, czy obiekt i obiekt widoku są zsynchronizowane.

Efekty uboczne: app/console doktryna: schemat: aktualizacja - dump-sql Jeśli widok i obiekt nie są zsynchronizowane, wygeneruje to kod SQL, który nie powinien zostać wykonany! Musisz ręcznie zaktualizować swój widok do swojej bazy danych.

Korzystam z migracji doktryn, która rozwiązuje ten problem. Chociaż doktryna: schemat: update --dump-sql jest całkiem przydatna do sprawdzenia, co nie pasuje do twojego widoku/obiektu.

UWAGA: Ten hack przestaje tworzyć tabelę, ale różnica w schemacie doktrynowym wciąż próbuje zaktualizować "tabelę" dodając obce klucze.

0

Powinieneś być w stanie wykorzystać setFilterSchemaAssetsExpression.

http://www.doctrine-project.org/api/dbal/2.4/source-class-Doctrine.DBAL.Configuration.html#87-99

W przeciwnym razie, jeśli chcesz zrobić mniej więcej programowanie i config, które można umieścić na stanowisku do innego kierownika jednostki. Nie najpiękniejszy sposób jednak ....

https://symfony.com/doc/3.3/doctrine/multiple_entity_managers.html

+0

1) $ conf-> setFilterSchemaAssetsExpression() filtruje, które doktryny tabel mogą wyświetlać z bazy danych, więc nie może być użyty w tym celu, ponieważ doktryna wciąż próbuje utworzyć tę tabelę. 2) Rejestrowanie jej w innym menedżerze encji/połączenie to * ciekawe podejście *, ale wtedy nie będę miał dostępu do reszty obiektów, które łączę z widoku. Więc każde z tych rozwiązań rozwiązuje ten problem – albert