2012-01-19 24 views
14

Tengo una entidad Item que tiene una relación ManyToOne con una entidad Category. Quiero que se unan a un campo que no sea id de Categoría (en este caso, un campo llamado id2). Mi esquema se detalla a continuación.¿Es posible hacer referencia a una columna que no sea 'id' para JoinColumn?

class Item { 
    /** 
    * @ORM\Id 
    * @ORM\Column(name = "id", type = "integer") 
    * @ORM\GeneratedValue(strategy = "AUTO") 
    */ 
    protected $id; 
    /** 
    * @ORM\ManyToOne(targetEntity = "Category") 
    * @ORM\JoinColumn(name = "category_id", referencedColumnName = "id2") 
    */ 
    protected $category; 
} 

class Category { 
    /** 
    * @ORM\Id 
    * @ORM\Column(name = "id", type = "integer") 
    * @ORM\GeneratedValue(strategy = "AUTO") 
    */ 
    protected $id; 
    /** 
    * @ORM\Column(name = "id2", type = "string", length = "255", unique = "true") 
    */ 
    protected $id2; 

Cuando trato de guardar un Item consigo este error:

Notice: Undefined index: id2 in vendor/doctrine/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php line 511

Efectivamente, si cambio id2-id en el JoinColumn anotación, todo funciona bien, pero necesito las entidades a ser conectado a través de id2. es posible?

Editar
Lo que quiero lograr es imposible de acuerdo a la doctrina oficial 2 docs.

It is not possible to use join columns pointing to non-primary keys. Doctrine will think these are the primary keys and create lazy-loading proxies with the data, which can lead to unexpected results. Doctrine can for performance reasons not validate the correctness of this settings at runtime but only through the Validate Schema command.

fuente: http://www.doctrine-project.org/docs/orm/2.1/en/reference/limitations-and-known-issues.html

Respuesta

7

Creo Doctrina quiere que éstos sean claves primarias, de the docs:

name: Column name that holds the foreign key identifier for this relation.

Otra cosa que salta a mí desde el ejemplo de código es category.id2 siendo tipocadena, por lo menos esperaría que fuera entero, pero también puede ser necesario para @JoinColumn para funcionar correctamente.

Usted puede ser capaz de salirse con sólo @Index en category.id2 y dejarlo como una cadena sin embargo; vale la pena intentarlo de todos modos.

+0

Gracias por la respuesta. Traté de cambiar el tipo de campo a entero, y agregué @Index, pero todavía no funciona. –

+0

¡Bah! Parece que necesitan ser fk después de todo. Siempre hay muchos a muchos como una opción. – quickshiftin

2

Solo para informar. Pude unir PK no-PK en relación Many2One (no direccional), PERO mi objeto no se puede cargar de la manera normal. Debe ser cargado con DQL como:

SELECT d,u FROM DEntity d 
    JOIN d.userAccount u 

esta manera deje de tener error: Falta el valor de ID de clave principal en ....

Cuestiones relacionadas