У меня есть сущность:
/** * * @Table(name="table") * @Entity */ class Table { /** * @Column(type="integer") * @Id * @GeneratedValue(strategy="IDENTITY") */ private $id; /** * @ManyToOne(targetEntity="Entities\Users") * @joinColumn(name="userId", referencedColumnName="id") */ private $User; /** * @Column(type="string") */ private $text; }
Если я делаю $q->getQuery()->getSingleResult()->getUser()->getUserId()
doctrine генерирует запрос типа:
SELECT * FROM table t INNER JOIN users u ON u.id = t.userId WHERE id = 100
но если мне не нужны пользователи таблицы, как получить userId.
В чистом SQL я могу просто
SELECT * FROM table WHERE id = 100
и получите пользовательскую таблицу без соединения пользователей.
Вы также можете посмотреть функцию IDENTITY () (версия Doctrine> 2.2).
Пример:
SELECT IDENTITY(t.User) AS user_id from Table
Должен вернуться:
[ ['user_id' => 1], ['user_id' => 2], ... ]
Попробуй это:
$q = $qb->getQuery(); $q->setHint(\Doctrine\ORM\Query::HINT_INCLUDE_META_COLUMNS, true);
Согласно документации, сущности D2 никогда не должны подвергаться внешнему ключу, поскольку все это делается внутренне с помощью информации о сопоставлении, однако, как вы выяснили, существует потребность в том, чтобы получить это значение. Для этого просто поставьте информацию о сопоставлении для внешнего ключа.
Я не знаю doctrine2, но из того, что я прочитал, это ORM. Поэтому я хотел бы предложить, чтобы вам нужна форма ленивой загрузки, где пользователь не загружен. В этой статье предлагается, что ленивая загрузка доступна в doctrine2 .
Это может привести к нескольким вызовам db, если впоследствии пользователь будет использовать возвращаемую таблицу. Вы должны взвесить это с идеей захвата данных одним ударом.