2012-04-29 6 views
7

sto ottenendo il seguente errore quando provo a fare ./app/console doctrine:migrate:diff:errore quando targetEntity è in un bundle diverso

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

Ecco la linea che è la causa:

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

Ecco la parte rilevante della mia classe:

<?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; 

quello che ho capito è dire, non è che non può trovaVNN\CoreBundle\Entity\Game, solo che Game non è un'entità valida. Quindi, ecco 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; 
    } 
} 

Perché non piace Game?

Aggiornamento: Ho avuto lo stesso identico problema ancora una volta quando ho provato a fare la stessa cosa con un'altra entità cross-bundle. Ho trovato this post, ma la correzione add-a-leading-slash non lo ha fatto per me come evidentemente ha fatto per l'OP lì.

+0

Hai provato a utilizzare "\ VNN \ CoreBundle \ Entity \ Game" anziché "VNN \ CoreBundle \ Entity \ Game"? –

+0

Sì. Non è piaciuto neanche quello. –

+0

Quale versione di Symfony e della dottrina stai usando? Ho lo stesso setup in uno dei miei progetti, e funziona lì:/Ma sono d'accordo con te che sembra che Game non sia valido, tuttavia, guardando nel codice della dottrina, quel messaggio dovrebbe venire solo se la classe non è annotato come Doctrine \ ORM \ Mapping \ Entity, che questo chiaramente è ... –

risposta

12

ho utilizzato con successo le relazioni tra le entità incrociate senza problemi. se hai disabilitato il mapping automatico devi dire a doctrine ogni bundle che contiene entità.

così in app/config.yml è necessario avere sia questo:

doctrine: 
    orm: 
     auto_mapping: true 

o questo:

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

controllare il database se esistono tabelle per i fasci. Inoltre si potrebbe provare a eseguire ./app/console doctrine:generate:entities --force e assicurarsi che venga eseguito senza errori

modificare

ho controllato il mio codice e il leader / non è necessario. anche la dichiarazione use è superflua.

+0

Questo sembra aver funzionato. Ho un vago ricordo di avere una ragione per non usare 'auto_mapping', quindi ho provato il tuo secondo suggerimento di assicurarmi che ciascuna delle mie mappature fosse elencata esplicitamente. Ora sto riscontrando un errore diverso - sta cercando nel database sbagliato - ma quell'errore è molto più facile da digerire rispetto a quello che stavo facendo prima. Grazie! –

+0

hanno la stessa vaga memoria riguardo al non utilizzo della mappatura automatica ... potrebbe essere necessario fare qualcosa con le estensioni doctrine ma non sono sicuro;) – room13

2

Sono riuscito a ottenere qualcosa del genere per funzionare nei miei pacchetti.

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

Non è necessaria la dichiarazione use \Company\SomeBundle\Entity\Game.

Inoltre, assicurarsi che entrambi i pacchetti siano abilitati nel file AppKernel.php.

Problemi correlati