Подтвердить что ты не робот

Доктрина: возможно ли УКАЗАТЬ по соответствующей области?

У меня есть модель 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?

4b9b3361

Ответ 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);