我有这样的实体:
/**
*
* @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。
答案 0 :(得分:36)
您可能还想查看IDENTITY()函数(Doctrine版本> 2.2)。
示例:
SELECT IDENTITY(t.User) AS user_id from Table
应该返回:
[ ['user_id' => 1], ['user_id' => 2], ... ]
答案 1 :(得分:6)
试试这个:
$q = $qb->getQuery();
$q->setHint(\Doctrine\ORM\Query::HINT_INCLUDE_META_COLUMNS, true);
答案 2 :(得分:0)
根据文档,D2实体永远不需要暴露外键,因为它全部由映射信息在内部完成,但是,正如您所知,有时需要具有此值。为此,只需提供外键的映射信息。
答案 3 :(得分:-5)
我不知道doctrine2,但从我读到的这是一个ORM。所以我建议你需要一种延迟加载的形式,用户没有加载。 This article suggests that lazy loading is available in doctrine2
如果稍后在返回的表上使用了用户,则可能会导致多次db调用。你必须权衡这一点,即抓住数据。