2017-11-24 16 views
7

Làm thế nào tôi có thể ngừng sử dụng symfony để tạo bảng cho chế độ xem mà tôi đã tạo trên quá trình di chuyển học thuyết?Làm cách nào để ngăn chặn học thuyết cố gắng tạo bảng cho chế độ xem đã được ánh xạ trên thực thể?

Entity lập bản đồ các điểm

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

Tôi có cũng như các tập tin thuyết di cư.

thuyết Cấu hình

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. 

thuyết schema update

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

Tôi đã thử ''/^(?! view _) /'' và nó hoạt động như mong đợi. Bạn đã cài đặt phiên bản Doctrine-DBAL nào? – yceruto

+0

Tôi cũng đã cấu hình nó dưới khoá 'dbal: 'trực tiếp. – yceruto

+0

DBAL v2.5.13 Như tôi đã hiểu, bộ lọc này dừng DBAL xem các bảng đó (view_ *) để Doctrine cố gắng tạo bảng mọi lúc – albert

Trả lời

2

Câu trả lời ngắn: Nó không thể được thực hiện.

Điều này xảy ra vì MysqlPlatform bỏ qua các chế độ xem.

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

Giải pháp: Tạo một MysqlPlatform mới mà không bỏ qua quan điểm:

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

Tạo một dịch vụ với nền tảng của bạn:

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

Sử dụng nền tảng đó với kết nối của bạn:

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" 

học thuyết ứng dụng/giao diện điều khiển: lược đồ: xác thực Lệnh này xác nhận rằng thực thể và thực thể dạng xem được đồng bộ hóa.

Tác dụng phụ: học thuyết ứng dụng/giao diện điều khiển: lược đồ: cập nhật --dump-sql Nếu chế độ xem và thực thể không đồng bộ hóa, điều này sẽ tạo SQL không nên được thực hiện! Bạn phải tự cập nhật chế độ xem của mình trên cơ sở dữ liệu.

Tôi sử dụng di trú học thuyết để giải quyết vấn đề này. Mặc dù doctrine: schema: update --dump-sql khá hữu ích để kiểm tra những gì nó không phù hợp trong khung nhìn/thực thể của bạn.

LƯU Ý: Bản hack này ngừng tạo bảng nhưng lược đồ khác biệt của giáo lý vẫn cố gắng cập nhật "bảng" thêm các khóa ngoại.

0

Bạn sẽ có thể sử dụng setFilterSchemaAssetsExpression.

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

Không đó, nếu bạn muốn làm ít lập trình và cấu hình hơn, bạn có thể đặt quan điểm vào một nhà quản lý thực thể. Không phải là cách đẹp nhất mặc dù ....

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

+0

1) $ conf-> setFilterSchemaAssetsExpression() bộ lọc mà bảng giáo lý được phép xem từ cơ sở dữ liệu vì vậy nó không thể được sử dụng cho mục đích này như học thuyết giữ cố gắng để tạo ra rằng bảng 2) Đăng ký nó trong một người quản lý thực thể khác nhau/kết nối nó là một * cách tiếp cận thú vị * nhưng sau đó tôi sẽ không có quyền truy cập vào phần còn lại của các thực thể mà tôi đang liên kết từ xem. Vì vậy, bất kỳ giải pháp nào khắc phục vấn đề này – albert

Các vấn đề liên quan