Ответ 1
Вы также можете посмотреть функцию IDENTITY() (версия Doctrine > 2.2).
Пример:
SELECT IDENTITY(t.User) AS user_id from Table
Должен вернуться:
[ ['user_id' => 1], ['user_id' => 2], ... ]
У меня есть сущность:
/**
*
* @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
и получить userId без таблицы подключений.
Вы также можете посмотреть функцию 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, если позже пользователь будет использовать возвращаемую таблицу. Вы должны взвесить это с идеей захвата данных одним ударом.