2012-04-29 17 views
7

我收到以下錯誤,當我嘗試做./app/console doctrine:migrate:diff錯誤時targetEntity是在不同的包

[Doctrine\ORM\Mapping\MappingException]           
    Class VNN\CoreBundle\Entity\Game is not a valid entity or mapped super class. 

下面是導致它的行:

/** 
* @ORM\ManyToOne(targetEntity="VNN\CoreBundle\Entity\Game") 

下面是相關的部分我的班級:

<?php 

namespace VNN\PressboxBundle\Entity; 

use Gedmo\Mapping\Annotation as Gedmo; 
use Doctrine\ORM\Mapping as ORM; 
use Doctrine\ORM\Query\Expr\OrderBy; 
use Symfony\Component\Validator\Constraints as Assert; 
use Symfony\Component\Validator\Mapping\ClassMetadata; 
use Symfony\Component\Validator\Constraints\NotBlank; 
use Symfony\Component\Validator\Constraints\Type; 
use VNN\CoreBundle\Entity\Game; 

/** 
* VNN\PressboxBundle\Entity\Event 
* 
* @ORM\Table(name="event") 
* @ORM\Entity 
*/ 
class Event 
{ 
    /** 
    * @var integer $id 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @ORM\ManyToOne(targetEntity="VNN\CoreBundle\Entity\Game") 
    * @ORM\JoinColumn(name="core_game_id", referencedColumnName="game_id") 
    **/ 
    private $coreGame; 

我的理解是說它不是找到VNN\CoreBundle\Entity\Game,只是Game不是一個有效的實體。因此,這裏的Game.php

<?php 

namespace VNN\CoreBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* VNN\CoreBundle\Entity\Game 
* 
* @ORM\Table(name="games") 
* @ORM\Entity 
*/ 
class Game 
{ 
    /** 
    * @var integer $id 
    * 
    * @ORM\Column(name="game_id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var integer $homeSchoolId 
    * 
    * @ORM\Column(name="home_school_id", type="integer") 
    */ 
    private $homeSchoolId; 

    /** 
    * @var integer $awaySchoolId 
    * 
    * @ORM\Column(name="away_school_id", type="integer") 
    */ 
    private $awaySchoolId; 

    /** 
    * @ORM\ManyToOne(targetEntity="School") 
    * @ORM\JoinColumn(name="home_school_id", referencedColumnName="school_id") 
    **/ 
    private $homeSchool; 

    /** 
    * @ORM\ManyToOne(targetEntity="School") 
    * @ORM\JoinColumn(name="away_school_id", referencedColumnName="school_id") 
    **/ 
    private $awaySchool; 

    /** 
    * @ORM\ManyToOne(targetEntity="Sport") 
    * @ORM\JoinColumn(name="sport_id", referencedColumnName="sport_id") 
    **/ 
    private $sport; 

    /** 
    * @var integer $datetime 
    * 
    * @ORM\Column(name="game_datetime") 
    */ 
    private $datetime; 

    /** 
    * @var integer $homeScore 
    * 
    * @ORM\Column(name="home_score", type="integer") 
    */ 
    private $homeScore; 

    /** 
    * @var integer $awayScore 
    * 
    * @ORM\Column(name="away_score", type="integer") 
    */ 
    private $awayScore; 

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

    public function getHomeSchool() 
    { 
     if ($this->homeSchoolId > 0) { 
      return $this->homeSchool; 
     } else { 
      return FALSE; 
     } 
    } 

    public function getAwaySchool() 
    { 
     if ($this->awaySchoolId > 0) { 
      return $this->awaySchool; 
     } else { 
      return FALSE; 
     } 
    } 

    public function recordIsValid() 
    { 
     if (!($this->homeSchoolId > 0)) { 
      return FALSE; 
     } 

     if (!($this->awaySchoolId > 0)) { 
      return FALSE; 
     } 

     return TRUE; 
    } 

    public function getSport() 
    { 
     return $this->sport; 
    } 

    public function getHumanDatetime() 
    { 
     $date = new \DateTime($this->datetime); 
     return $date->format('F d, Y g:ia'); 
    } 

    public function getDatetime() 
    { 
     $date = new \DateTime($this->datetime); 
     return $date->format('m/d/Y g:i:s a'); 
    } 

    public function getOpposingSchoolWithRespectToSchoolName($schoolName) 
    { 
     if ($schoolName == $this->getHomeSchool()->getName()) { 
      return $this->getAwaySchool(); 
     } else { 
      return $this->getHomeSchool(); 
     } 
    } 

    public function getHomeScore() 
    { 
     return $this->homeScore; 
    } 

    public function getAwayScore() 
    { 
     return $this->awayScore; 
    } 
} 

它爲什麼會不喜歡Game

更新:當我試圖對另一個交叉綁定實體做同樣的事情時,我再次遇到了同樣的問題。我發現this post,但是添加一個前導斜槓修復程序對我來說並沒有這樣做,就好像它明顯在OP那樣。

+0

您是否嘗試使用「\ VNN \ CoreBundle \ Entity \ Game」而不是「VNN \ CoreBundle \ Entity \ Game」? – 2012-05-01 10:41:56

+0

是的。它也不喜歡那樣。 – 2012-05-01 11:59:12

+0

你使用的是什麼版本的Symfony和原則?我在我的一個項目中有相同的設置,並且它在那裏工作:/但我同意你看它看起來像遊戲是無效的,但是在查看教義代碼時,只有當類不是註釋爲Doctrine \ ORM \ Mapping \ Entity,這顯然是... – 2012-06-09 11:01:42

回答

12

我已經成功地使用了交叉束實體關係而沒有任何問題。如果您禁用了自動映射功能,則需要將包含實體的每個包分配給原則。

所以在app/config.yml你需要有這樣兩種:

doctrine: 
    orm: 
     auto_mapping: true 

或本:

doctrine: 
    orm: 
     auto_mapping: false 
     entity_managers: 
      default: 
       mappings: 
        VNNCoreBundle: ~ 
        VNNPressboxBundle: ~ 

檢查數據庫是否存在束表。還可以嘗試運行./app/console doctrine:generate:entities --force,並確保它運行沒有錯誤

編輯

我檢查我的代碼和領先/是沒有必要的。 use聲明也是多餘的。

+0

這似乎奏效了。我有一個模糊的記憶,有一個不使用'auto_mapping'的理由,所以我嘗試了第二個建議,確保每個映射都被明確列出。我現在得到了一個不同的錯誤 - 它正在尋找錯誤的數據庫 - 但是這個錯誤比我之前得到的要容易得多。謝謝! – 2012-06-12 20:13:53

+0

有關於不使用自動映射的模糊內存...它可能不得不做一些與教義擴展,但我不知道;) – room13 2012-06-12 20:52:42

2

我能夠得到像這樣的東西在我的包中工作。

/** 
* @ORM\ManyToOne(targetEntity="\Company\SomeBundle\Entity\Game") 
*/ 

您不需要use \Company\SomeBundle\Entity\Game聲明。

另外,請確保您的AppKernel.php文件中已啓用這兩個軟件包。