2017-11-24 21 views
7

मैं सिद्धांत के प्रवासन पर बनाए गए दृश्य के लिए तालिका बनाने की कोशिश कर सिम्फनी को कैसे रोक सकता हूं?किसी इकाई पर मैप किए गए दृश्य के लिए तालिका बनाने की कोशिश कर रहे सिद्धांत को कैसे रोकें?

इकाई मानचित्रण दृश्य

/** 
* 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 स्कीमा सत्यापित करें

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. 

सिद्धांत स्कीमा अद्यतन

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

मैंने ''/^(?! view _) /' 'की कोशिश की है और यह अपेक्षा के अनुसार काम करता है। क्या आप सिद्धांत-डीबीएएल का संस्करण स्थापित कर रहे हैं? – yceruto

+0

मैंने इसे सीधे 'dbal: 'key के अंतर्गत भी कॉन्फ़िगर किया। – yceruto

+0

डीबीएएल v2.5।13 जैसा कि मैंने यह फ़िल्टर समझ लिया है कि डीबीएएल उस तालिका को देख रहा है (view_ *) तो सिद्धांत हर समय तालिका बनाने की कोशिश करता है – 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" 

ऐप/कंसोल सिद्धांत: स्कीमा: मान्य करें यह आदेश मान्य करता है कि इकाई और दृश्य इकाई सिंक हो रही है।

साइड इफेक्ट: एप्लिकेशन/कंसोल सिद्धांत: स्कीमा: अद्यतन --dump-एसक्यूएल देख सकते हैं और इकाई सिंक में नहीं हैं, तो इस एसक्यूएल कि निष्पादित नहीं किया जाना चाहिए उत्पन्न होगा! आपको अपने डेटाबेस पर मैन्युअल रूप से अपना दृश्य अपडेट करना होगा।

मैं सिद्धांतों का उपयोग करता हूं जो इसे हल करता है। यद्यपि सिद्धांत: स्कीमा: अद्यतन - डंप-एसक्यूएल यह देखने के लिए काफी उपयोगी है कि यह आपके व्यू/इकाई में मेल नहीं खा रहा है।

नोट: यह हैक तालिका बनाने से रोकता है लेकिन सिद्धांत स्कीमा diff अभी भी "कुंजी" को विदेशी कुंजी जोड़ने के लिए अद्यतन करने का प्रयास करता है।

0

आप setFilterSchemaAssetsExpression उपयोग करने के लिए सक्षम होना चाहिए।

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

असफल है कि, अगर आप कम प्रोग्रामिंग और अधिक config क्या करना चाहते हैं, तो आप किसी अन्य संस्था प्रबंधक में दृश्य डाल सकते हैं। नहीं सबसे अच्छा तरीका है, हालांकि ....

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

+0

1) $ conf-> setFilterSchemaAssetsExpression() फ़िल्टर करता है कि कौन से टेबल सिद्धांत डेटाबेस से देखने की अनुमति है, इसलिए इसका उपयोग इस उद्देश्य के लिए नहीं किया जा सकता है क्योंकि सिद्धांत उस तालिका को बनाने की कोशिश करता रहता है 2) इसे एक अलग इकाई प्रबंधक में पंजीकृत करना/कनेक्शन यह एक * दिलचस्प दृष्टिकोण है * लेकिन तब मुझे उन सभी संस्थाओं तक पहुंच नहीं होगी जिन्हें मैं दृश्य से जोड़ रहा हूं। तो इनमें से कोई भी समाधान इस समस्या को ठीक करता है – albert

संबंधित मुद्दे