2011-08-03 14 views
7

Supongamos que tengo una oferta, que puede tener rango 1-n. Inmediatamente piensas, "pon un offer_id dentro de Range".¿Cómo tratar la asociación en entidades clave compuestas con Doctrine2?

Pero mi oferta tiene una clave principal compuesta (compuesta por dos campos). No hay una columna de identificación AUTOINCREMENTO.

documentación

El Doctrine2 no dice mucho sobre ese caso en particular, aquí está mi entidades:

<?php 
use Doctrine\ORM\Mapping as ORM; 
/** 
* @ORM\Table() 
* @ORM\Entity 
*/ 
class Offer 
{ 
    /** 
    * @var Site $site 
    * @ORM\Id 
    * @ORM\ManyToOne(targetEntity="Site") 
    * @ORM\JoinColumn(name="site_id", referencedColumnName="id") 
    */ 
     private $site; 

    /** 
    * @var string $pouet 
    * @ORM\Id 
    * @ORM\Column(name="pouet", type="string", length=255) 
    */ 
    private $pouet; 
} 

<?php 
use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Table(name="RangeItem") 
* @ORM\Entity 
*/ 
class Range 
{ 
    /** 
    * @todo This is test code only do not push me :-) 
    * @var ArrayCollection 
    * @ORM\ManyToOne(targetEntity="Offer") 
    */ 
    private $offers; 
} 

I obtaind este error:

[Doctrine\ORM\ORMException]
Column name id referenced for relation from Pouet\MyBundle\Entity\Range towards Pouet\MyBundle\Entity\Offer does not exist.

que tienen sentido, pero ¿cómo puedo tratar yo con este problema? ¿Está prohibido que una tabla con clave primaria compuesta tenga asociaciones en él?

Respuesta

1

usted debería ser capaz de utilizar una anotación @JoinColumn en la clase Range para especificar los Id de empleo:

/** 
* @ORM\ManyToOne(targetEntity="Offer") 
* @ORM\JoinColumn(name="offer_pouet", referencedColumnName="pouet") 
*/ 
private $offers; 

Debido a que los valores por defecto para @JoinColumn, si no se especifica ellos, serían offer_id y id, respectivamente, necesita especificar manualmente (estoy asumiendo un poco que pouet es un valor único para su clase Offer).

EDIT: basado en su comentario, me encontré con un tutorial sobre el sitio del Proyecto Doctrina de Composite Primary Key. La relación de entidad tiene mappedBy para una clave y indexBy para la otra. Espero que ayude.

+0

Tengo una clave compuesta, la clave principal de mi oferta es la combinaison de $ site AND $ pouet. Es por eso que no puedo usar referenciaColumnName, no hay un nombre de columna para PK cuando tiene uno compuesto. – Damien

+0

Tengo, edición. – Problematic

+0

Thx para el enlace, pero eso tampoco funciona. Todavía no puedo entender cómo hacer referencia a mi objeto Oferta dentro de otras entidades. Estoy pensando seriamente en descartar la clave compuesta sexy para tener un ID autoincrementado simple en su lugar (y un índice ÚNICO en mis campos). – Damien

Cuestiones relacionadas