index doctrine2 dql many-to-one

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í.

Trabajando con Asociaciones Indexadas

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