Доктрина: возможно ли УКАЗАТЬ по соответствующей области?
У меня есть модель Doctrine (Assignment
), которая имеет отношение "много к одному" с другой моделью (Region
). Присвоения принадлежат пользователям (каждый пользователь имеет только одно задание по региону за раз), и я пытаюсь использовать indexBy
для того, чтобы пользовательский массив назначений определялся идентификатором области назначения. Тем не менее, я получаю только стандартные 0..n числовые ключи.
Когда я пытаюсь запустить DQL-запрос, например SELECT am, reg, user FROM Assignment am INDEX BY [...] JOIN am.region reg JOIN am.user user WHERE user.id = ?1
, ни одно из этих значений для INDEX BY не работает:
-
Region
(Ошибка: Invalid PathExpression. Должно быть выражение StateFieldPathExpression.)
-
region_id
(Ошибка: Class...\Assignment не имеет поля или ассоциации с именем region_id)
-
region.id
(Ошибка: ожидаемый конец строки, полученный '.')
Возможно ли это? Если нет, то какой удобный способ получить доступ к присваиванию User
в области без indexBy
?
Ответы
Ответ 1
Сегодня я столкнулся с той же проблемой. К счастью, я нашел решение:)
Прежде всего, вы должны объявить дополнительный столбец в сопоставлении 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: { }
Обратите внимание, что я объявил entityB_id
как поле . Я настроил отношение manyToOne, добавив предложение joinColumn
теперь вы можете использовать entityB_id как скалярное значение
$doctrine->getEntityManager()->createQueryBuilder()
->select('c')
->from('AbdulklaraplMyBundle:EntityA', 'c', 'c.entityB_id')
->getQuery()->getResult();
он вернет массив-помощник
[
c.entityB_id: {
id: "",
value: ""
entityB_id: ""
}
]
вы также можете использовать AbstractQuery::HYDRATE_ARRAY
в качестве аргумента для getResult()
- он возвращает массив-реплика с массивом вместо объектов
Ответ 2
Если вам нужен ИНДЕКС по внешнему ключу, например. "region_id" можно в вашем отображении:
/**
* @ORM\OneToMany(targetEntity="Region", mappedBy="user", indexBy="region_id")
*/
protected $regions;
Эта функция была добавлена здесь.
К сожалению, похоже, что не указано, что вам нужно использовать имя столбца самого внешнего ключа.
Работа с индексированными ассоциациями
Ответ 3
Импортировать класс запроса (необязательно):
use \Doctrine\ORM\Query;
Создайте запрос:
$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);