2014-01-14 44 views
8

我有一個實體之間共享代碼的Trait文件。Symfony2命令「doctrine:schema:update」未檢測到實體中使用的特徵文件更改

特徵文件例如:

<?php 
namespace Acme\CmsBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* BaseHtml Trait 
* 
*/ 
trait BaseHtml 
{ 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="status", type="string", length=20) 
    */ 
    private $status; 

    /** 
    * @var \DateTime 
    * 
    * @ORM\Column(name="date", type="datetime") 
    */ 
    private $date; 

    public function setStatus($status) 
    { 
     $this->status = $status; 

     return $this; 
    } 

    public function getStatus() 
    { 
     return $this->status; 
    } 

    public function setDate($date) 
    { 
     $this->date = $date; 

     return $this; 
    } 

    public function getDate() 
    { 
     return $this->date; 
    } 

} 

實體文件,例如:

<?php 

namespace Acme\CmsBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* Page 
* 
* @ORM\Table() 
* @ORM\Entity 
* 
* 
*/ 
class Page 
{ 

    use BaseHtml; 


    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var string 
    * 
    * @ORM\ManyToOne(targetEntity="Application\Sonata\MediaBundle\Entity\Gallery") 
    */ 
    private $gallery; 



    public function getId() 
    { 
     return $this->id; 
    } 


    public function setGallery(\Application\Sonata\MediaBundle\Entity\Gallery $gallery) 
    { 
     $this->gallery = $gallery; 

     return $this; 
    } 


    public function getGallery() 
    { 
     return $this->gallery; 
    } 
} 

但是,當我修改特性文件的註釋或添加新列,執行「PHP應用程序/控制檯學說:架構:更新「:

Nothing to update - your database is already in sync with the current entity metadata. 

我需要手動更改所有使用特徵f的實體文件的日期修改ile獲得教條:schema:更新正常運行。

我試着用命令

php app/console doctrine:cache:clear-metadata 
php app/console cache:clear 

之前執行學說:架構:更新,但是沒有結果。

任何想法不要手動更新實體文件和原則:架構:更新檢測更新特性文件時實體的更新,我失去了與特性共享代碼的優點的一部分。

+0

也許你忘了包含'trait'命名空間/類? –

+0

感謝您的回覆。特質文件和實體文件位於相同的命名空間中(對不起,當我複製源錯過特徵文件的第一行時)。我在不同的命名空間中測試過放置文件,但在嘗試更新時測試了相同的結果:模式 – Ravz

回答

5

您可以通過執行強制此:

php app/console cache:clear 
php app/console doctrine:schema:update --force 
+1

我已經更新了symfony和所有供應商,並且現在使用該命令清理了元數據緩存。也許一些文件系統腐敗。感謝您的回覆 – Ravz

+0

慚愧,但似乎Doctrine沒有檢測到特性更改作爲緩存更新的一部分,所以這似乎是目前最簡單的解決方案。 – Ryall

+0

使用'composer update'更新所有供應商也適用於我。奇怪。 – MakG

8

可能是我太晚了,但如果你使用的memcache你需要清除內存緩存太。所以你需要這樣做:

echo 'flush_all' | nc yourhost 11211 
php app/console cache:clear 
php app/console doctrine:schema:update 
+1

或者redis的問題 –

+0

希律是對的。 Smthg like redis-cli flushall,然後更新它。 – Albeis

2

你可能忘記啓用Doctrine自動映射;

orm: 
     #auto_mapping: true 

如果自動映射被禁用(或評論等上面),則應該手動註冊每個束的Entiteis。

orm: 
     entity_managers: 
        default: 
         mappings: 
          AcmeHelloBundle: ~ 
5

嘗試啓用主義自動映射和刪除此文件夾:YourBundle \資源\ CONFIG \學說

0

類聲明之前檢查你的註釋。有沒有@ORM\Entity?在我的情況下添加這條線有幫助。