2017-11-24 14 views
7

symfonyがdoctrineの移行で作成したビュー用のテーブルを作成しようとするのを止める方法はありますか?doctrineがエンティティにマップされたビュー用のテーブルを作成しようとするのを止めるには?

エンティティマッピングビュー

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

私だけでなく教義移行ファイルを持っています。

教義設定

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

DoctirneスキーマあなたがsetFilterSchemaAssetsExpressionを使用することができるはず

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. 

Doctrineのスキーマの更新

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

私は '/ ^(?! view _)/ ''を試しましたが、期待どおりに動作しています。 Doctrine-DBALのどのバージョンをインストールしましたか? – yceruto

+0

私は 'dbal:'キーの下で直接設定しました。 – yceruto

+0

DBAL v2.5。13このフィルタはDBALがそのテーブル(view_ *)を見るのを止めるので、Doctrineは常にテーブルを作成しようとします – albert

答えて

2

ない素敵な道短い答え:それは行うことはできません。

これは、MysqlPlatformがビューを無視するために発生します。

//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'"; 
    } 
[...] 

ソリューション:

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

は、ご使用のプラットフォームとサービスを作成します:

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

があなたの接続とそのプラットフォームを使用してください:

意見を無視していない新しいMysqlPlatformを作成します。
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 このコマンドは、エンティティとビューエンティティが同期していることを検証します。

副作用:app/console doctrine:schema:update --dump-sql ビューとエンティティが同期していないと、これは実行されるべきではないSQLを生成します。データベースのビューを手動で更新する必要があります。

私はこれを解決するdoctrineの移行を使用します。 doctrine:schema:update --dump-sqlはあなたのビュー/エンティティで一致していないものを確認するのに非常に便利です。

注:このハックはテーブルの作成を中止しますが、doctrineスキーマdiffは引き続き外部キーを追加する「テーブル」を更新しようとします。

0

を検証します。あなたはあまりプログラミングとより多くの設定を行うしたい場合、あなたは別のエンティティマネージャにビューを置くことができる、という失敗

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

。しかし....

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

+0

1)$ conf-> setFilterSchemaAssetsExpression()は、doctrineがそのテーブルを作成しようとしているので、doctrineがデータベースから見えるテーブルをフィルタリングするので、この目的には使用できません。 2)別のエンティティマネージャ/接続は興味深いアプローチです*しかし、私はビューからリンクしている残りのエンティティにアクセスすることはできません。 これらの解決策のいずれもこの問題を解決します – albert

関連する問題