如果将结果水合为数组,如何使用Doctrine 2 Query Builder检索外键?

时间:2017-02-16 02:37:45

标签: php doctrine-orm doctrine

$posts = $qb
    ->select('p')
    ->from('MyBundle\Entity\Post', 'p')
    ->getQuery()
    ->getArrayResult();

上面的查询将返回类似这样的内容(+99列)

id | title | url                    | .... many columns here .....  | created_at
---|--------------------------------|-------------------------------|--------------------
 1 | hello | http://www.google.com/ |  |  - | -  | -  | -  | -  | - | 2017-01-01 00:00:00
 2 | world | http://www.yahoo.com/  |  |  - | -  | -  | -  | -  | - | 2017-01-01 00:00:00

但是,此表有一个FK(user_id),它引用表“user”。问题是:查询不会将FK列带入查询结果。我测试过,当结果被水合成一个数组(getArrayResult)时,它会忽略结果上的FK,当结果被水化为一个对象(getResult)时,它会带来FK的结果。好的,我读了这篇有用的帖子(http://shout.setfive.com/2015/01/31/including-foreign-keys-in-doctrine2-array-results/)并想出了一种检索FK的方法,如下面的代码所示(不确定这是否是合适的方式,但是在工作中)

$posts = $qb
    ->select('p')
    ->from('MyBundle\Entity\Post', 'p')
    ->getQuery()
    ->setHint(\Doctrine\ORM\Query::HINT_INCLUDE_META_COLUMNS, true)
    ->getArrayResult();

尽管如此,我还面临另一个我目前无法解决的问题。正如我所说,这个表有+99列。但是,我不想要所有这些。 我想要的只是+99 中的3个。以下代码正常工作,直到......

$posts = $qb
    ->select(array('p.id', 'p.url'))
    ->from('MyBundle\Entity\Post', 'p')
    ->getQuery()
    ->setHint(\Doctrine\ORM\Query::HINT_INCLUDE_META_COLUMNS, true)
    ->getArrayResult();

...直到我在select上添加“p.user”,它代表FK(参见表用户,列id)。

$posts = $qb
    ->select(array('p.id', 'p.url', 'p.user'))
    ->from('MyBundle\Entity\Post', 'p')
    ->getQuery()
    ->setHint(\Doctrine\ORM\Query::HINT_INCLUDE_META_COLUMNS, true)
    ->getArrayResult();

这就是我得到的:

[Doctrine\ORM\Query\QueryException]                                                                                                              
[Semantical Error] line 0, col 10 near 'user FROM MyBundle\Entity\Post': Error: Invalid PathExpression. Must be a StateFieldPathExpression.

2 个答案:

答案 0 :(得分:1)

尝试类似

的内容
->select(array('p.id', 'p.name', IDENTITY(p.user))

这将返回用户的标识符/外键。 我从未使用select(array())符号,因此我的示例可能无法开箱即用。但IDENTITY(entity.association)是您正在寻找的。

答案 1 :(得分:0)

这是:

$posts = $qb
    ->select(array('p.id', 'p.url', 'u.id')) // u.id is your user id, change if your user id is different
    ->from('MyBundle\Entity\Post', 'p')
    ->leftJoin('MyBundle\Entity\User', 'u')
    ->getQuery()
    ->getArrayResult()
;