doctrine2 - Doctrine: ¿Es posible INDEX BY un campo relacionado?
doctrine annotations types (3)
Si necesita INDEX BY una clave externa, por ejemplo, "region_id", es posible en su mapeo:
/**
* @ORM/OneToMany(targetEntity="Region", mappedBy="user", indexBy="region_id")
*/
protected $regions;
La función fue agregada aquí .
Lamentablemente, no parece estar documentado que deba usar el nombre de la columna de la clave externa en sí.
Tengo un modelo de Doctrine ( Assignment
), que tiene una relación de muchos a uno con otro modelo ( Region
). Las asignaciones son propiedad de los usuarios (cada usuario tiene una sola asignación por región a la vez), y estoy tratando de usar indexBy
para que la matriz de asignaciones del usuario esté codificada por el ID de la región de la tarea. Sin embargo, solo obtengo las claves numéricas 0..n estándar.
Cuando trato de ejecutar una consulta DQL como SELECT am, reg, user FROM Assignment am INDEX BY [...] JOIN am.region reg JOIN am.user user WHERE user.id = ?1
, ninguno de estos valores para INDEX BY trabajo:
-
region
(Error: PathExpression no válido. Debe ser StateFieldPathExpression). -
region_id
(Error: Class ... / Assignment no tiene ningún campo o asociación llamada region_id) -
region.id
(Error: final esperado de la cadena, obtenido ''.'')
es posible? De lo contrario, ¿cuál sería una forma conveniente de acceder a la asignación de un User
en una región sin indexBy
?
Importar la clase de consulta (opcional):
use /Doctrine/ORM/Query;
Crea la consulta:
$query = $this->data->em->createQuery(''
SELECT a
FROM Assignment a
INDEX BY a.reg //to set array custom key
WHERE a.user = :user'');
$query->setParameter(''user'', 3); //user with id 3
//set the hidration mode in order to work with read-only arrays
$assignments = $query->getResult(Query::HYDRATE_ARRAY);
Estaba lidiando con el mismo problema hoy. Afortunadamente, he encontrado la solución:)
En primer lugar, debe declarar una columna adicional en el mapeo de ORM:
Abdulklarapl/My/EntityA:
type: entity
table: entityA
manyToOne:
entityB:
targetEntity: EntityB
joinColumn:
name: label_id
referencedColumnName: id
id:
id:
type: integer
id: true
generator:
strategy: AUTO
fields:
value:
type: text
entityB_id:
type: integer
lifecycleCallbacks: { }
note que he declarado entityB_id
como un campo + he configurado la relación manyToOne agregando una cláusula joinColumn
así que ahora puedes usar entityB_id como valor escalar
$doctrine->getEntityManager()->createQueryBuilder()
->select(''c'')
->from(''AbdulklaraplMyBundle:EntityA'', ''c'', ''c.entityB_id'')
->getQuery()->getResult();
devolverá array assoc
[
c.entityB_id: {
id: "",
value: ""
entityB_id: ""
}
]
también puede usar AbstractQuery::HYDRATE_ARRAY
como argumento para getResult()
- devolverá una matriz assoc con una matriz en lugar de los objetos