2012-04-29 11 views
7

Estoy recibiendo el siguiente error cuando trato de hacer ./app/console doctrine:migrate:diff:error al targetEntity está en un paquete diferente

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

Aquí está la línea que lo causa:

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

Aquí está la parte pertinente de mi clase:

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

lo que entiendo que está diciendo no es que no puede encuentraVNN\CoreBundle\Entity\Game, solo que Game no es una entidad válida. Así que aquí es 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; 
    } 
} 

¿Por qué sería no como Game?

Actualización: volví a tener el mismo problema cuando traté de hacer lo mismo con otra entidad de paquete cruzado. Encontré this post, pero la solución add-a-leading-slash no lo hizo para mí como lo hizo evidentemente para OP.

+0

¿Intentó utilizar "\ VNN \ CoreBundle \ Entity \ Game" en lugar de "VNN \ CoreBundle \ Entity \ Game"? –

+0

Sí. Tampoco le gustó eso. –

+0

¿Qué versión de Symfony y doctrina estás usando? Tengo la misma configuración en uno de mis proyectos, y funciona allí:/Pero estoy de acuerdo con usted en que parece que Game no es válido, sin embargo, al buscar en el código de doctrina, ese mensaje solo debería aparecer si la clase no está anotado como Doctrine \ ORM \ Mapping \ Entity, que este claramente es ... –

Respuesta

12

he utilizado con éxito las relaciones entre entidades de paquete cruzado sin ningún problema. Si tiene un mapeo automático desactivado, debe indicar a doctrine cada paquete que contiene entidades.

por lo que en aplicación/config.yml es necesario tener bien presente:

doctrine: 
    orm: 
     auto_mapping: true 

o esto:

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

comprobar su base de datos si existen tablas para los paquetes. También podría intentar correr ./app/console doctrine:generate:entities --force y asegurarse de que funciona sin errores

editar

he comprobado mi código y la principal / no es necesario. también la declaración use es superflua.

+0

Esto parece haber funcionado. Tengo un vago recuerdo de tener una razón para no usar 'auto_mapping', así que probé su segunda sugerencia para asegurarme de que cada una de mis asignaciones esté explícitamente enumerada. Ahora recibo un error diferente, está buscando en la base de datos incorrecta, pero ese error es mucho más fácil de asimilar de lo que estaba obteniendo antes. ¡Gracias! –

+0

tienen la misma memoria vaga sobre no usar el auto mapeo ... podría tener que hacer algo con las extensiones de doctrina pero no estoy seguro;) – room13

2

Pude conseguir algo como esto para trabajar en mis paquetes.

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

No necesita la declaración use \Company\SomeBundle\Entity\Game.

Además, asegúrese de que ambos paquetes estén habilitados en su archivo AppKernel.php.

Cuestiones relacionadas