2016-12-13 97 views
0

我試圖創建兩個entites之間的關聯。左邊是表格表示。右邊是視圖表示。Doctrine 2和MySQL:表和視圖之間的關聯映射

我只是成功地使這種關係的工作,但我有問題時創建與php vendor/bin/doctrine orm:schema-tool:create架構。

低於所需的所有代碼嘗試一下:

SQL

CREATE TABLE IF NOT EXISTS `demo` (
    `id` int(11) NOT NULL, 
    `name` varchar(30) COLLATE utf8_unicode_ci NOT NULL 
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

INSERT INTO `demo` (`id`, `name`) VALUES 
(1, 'demo 1'), 
(2, 'demo 2'), 
(3, 'demo 3'), 
(4, 'demo 4'); 

CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `demo_metadata` AS select `se`.`id` AS `demo_id`,12 AS `demo_count` from `demo` `se`; 

演示表實體

/** 
* @Entity 
* @Table(name="demo") 
*/ 
class Demo { 

    /** 
    * @Id 
    * @Column(type="integer") 
    * @GeneratedValue 
    */ 
    private $id; 

    /** 
    * @Column(type="string", length=30) 
    */ 
    private $name; 

    /** 
    * @OneToOne(targetEntity="DemoMetadata") 
    * @JoinColumn(name="id", referencedColumnName="demo_id") 
    */ 
    private $metadata; 

    public function getMetadata() { 
     return $this->metadata; 
    } 
} 

演示查看實體

/** 
* @Entity 
* @Table(name="demo_metadata") 
*/ 
class DemoMetadata { 

    /** 
    * @Id 
    * @Column(type="integer") 
    * @var int 
    */ 
    private $demo_id; 

    /** 
    * @Column(type="integer") 
    * @var int 
    */ 
    private $demo_count; 

    public function getDemoCount() { 
     return $this->demo_count; 
    } 
} 

查詢和獲取數據

$qb = $em->createQueryBuilder(); 
$qb 
    ->select('d') 
    ->from('Demo', 'd') 
    ->leftJoin('d.metadata', 'dm') 
    ->where('d.id = ?0') 
    ->setParameter(0, 1); 

$demo_object = $qb->getQuery()->getSingleResult(); 
var_dump($demo_object->getMetadata()->getDemoCount()); 

// display: int(12) 

正如我們所看到的,演示實體的元數據屬性使用來自視圖的數據填充。一切正常,如預期。

但是通過這樣的配置,在運行cli命令刪除架構並重新創建時,會出現錯誤,因爲demo_metadata表已存在。

最後,我沒有尋找一種方法來自動創建視圖。我有我可以調用來創建視圖的SQL腳本。我想知道是否有辦法不嘗試爲某些實體創建表?

[Doctrine\ORM\Tools\ToolsException]                                            
Schema-Tool failed with Error 'An exception occurred while executing 'CREATE TABLE demo_metadata (demo_id INT NOT NULL, demo_count INT NOT NULL, PRIMARY KEY(demo_id)) DEFAULT CHARACTER SET utf8 COLLATE utf8 _unicode_ci ENGINE = InnoDB':                                             
SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'demo_metadata' already exists' while executing DDL: CREATE TABLE demo_metadata (demo_id INT NOT NULL, demo_count INT NOT NULL, PRIMARY KEY(demo_id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB 

這只是一個方便的問題,因爲視圖已經存在並且不會使用cli drop命令丟棄。

難道來管理這一目標的唯一辦法是:

  1. 降架構(教義CLI)
  2. 刪除demo_metadata視圖
  3. 創建模式(教義CLI)
  4. 刪除demo_metadata
  5. 創建demo_metadata查看

由於

編輯

最後,我用這個代碼過濾我所需要的實體:

<?php 

class UpdateSchema extends \Doctrine\ORM\Tools\Console\Command\SchemaTool\UpdateCommand { 

    /** 
    * {@inheritdoc} 
    */ 
    protected function executeSchemaCommand(
     InputInterface $input, 
     OutputInterface $output, 
     SchemaTool $schemaTool, 
     array $metadatas) : int 
    { 
     $entities = array_filter($metadatas, function ($m) { 
      return !$m->isReadOnly; 
     }); 
     return parent::executeSchemaCommand($input, $output, $schemaTool, $entities); 
    } 
} 

回答

0

除了createdrop命令,也有一個update命令。這是你應該使用,如果該數據庫已經存在

錯誤答案的人,看到正確

+0

我試着用'update'你提出,但即使考慮到與名存在'demo_metadata'意見,更新機制會嘗試創建一個新表「demo_metadata」併發生錯誤。我被迫刪除視圖,進行更新,刪除「錯誤的」表並重新創建視圖... – rekam

+0

我的不好,沒有正確地閱讀這個問題。這個問題是你可能問的問題:http://stackoverflow.com/questions/12563005/ignore-a-doctrine2-entity-when-running-schema-manager-update – Xymanek

+0

好的,謝謝!我必須承認我會喜歡通過註釋解決方案,比如@Table(nogenerate = true),但cli更新覆蓋完美無缺!這有助於我最終從更好的角度提出我的問題。謝謝 – rekam