2017-11-24 302 views
7

Bir doktrin göçünde oluşturduğum görünüm için tablo oluşturmaya çalışırken nasıl yardımcı olabilirim?Doktrin, bir varlık üzerinde eşlenmiş bir görünüm için bir tablo oluşturmaya çalışmak nasıl?

Varlık haritalama görünümü

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

Ben de doktrin göç dosyası var.

Doctrine Configuration

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

Doctirne schema 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. 

Doctrine schema update

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

'/^(?! view _) /' 'ı denedim ve beklendiği gibi çalışıyor. Doctrine-DBAL hangi versiyonunu yüklediniz? – yceruto

+0

Ayrıca doğrudan 'dbal: 'anahtarının altında da yapılandırdım. – yceruto

+0

DBAL v2.5.13 Bu filtreyi anladığım için DBAL bu tabloları görüntülemeyi durdurur (view_ *) böylece Doctrine her zaman tabloyu oluşturmaya çalışır – albert

cevap

2

Kısa cevap: O yapılamaz.

Bu, MysqlPlatform görünümlerin yok sayılması nedeniyle olur.

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

Çözüm:

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

senin platformu ile bir hizmet oluşturun:

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

Bağlantınızda o platformu kullanın:

görüşlerini görmezden olmayan yeni bir MysqlPlatform oluştur
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 Bu komut, varlık ve görünüm öğesinin senkronize olduğunu doğrular.

Yan etkileri: uygulama/konsol doktrini: şema: görünümü ve varlık senkronize değilse güncelleme --dump-sql bu yürütülmemesi gerektiğini SQL üretecektir! Görünümünüzü veritabanınızda manuel olarak güncellemeniz gerekir.

Bunu çözen doktr geçişlerini kullanıyorum. Doctrine: schema: update --dump-sql, görünümünüz/öğenizde eşleşmediğini kontrol etmek için oldukça kullanışlıdır.

NOT: Bu kesmek, tabloyu oluşturmayı durdurur, ancak doktrin şema farkı hala yabancı anahtarları ekleyerek "tablo" u güncelleştirmeye çalışır.

0

You should be able etmek use setFilterSchemaAssetsExpression. Eğer daha az programlama ve daha yapılandırma yapmak istiyorum, sen başka bir varlık yöneticisi içine görünümü koyabilirsiniz Bu olmazsa,

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

. Değil en güzel yolu olsa ....

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

+0

1) $ conf-> setFilterSchemaAssetsExpression() doktrinleri, hangi doktrinin veritabanından görülebildiğini filtrelemesini sağlar, bu nedenle bu amaç için kullanılamaz. Doktora, bu tabloyu oluşturmaya çalışmayı sürdürürken 2) Farklı bir varlık yöneticisine kaydettirme/bağlantı bir * enteresan yaklaşım * ama sonra görüşten bağlantı kurduğum varlıkların geri kalanına erişemeyeceğim. Bu çözümlerden herhangi biri bu sorunu düzeltir – albert