$news = \DB::getEntityManager()->createQueryBuilder()
->select('n')
->from('Model\News', 'n')
->join('n.category', 'c')
->join('n.locales', 'l')
->where('l.language = :lang AND n.id = :id AND n.published = 1')
->setParameter('id', $news_id)
->setParameter('lang', $lang)
->getQuery()
->getResult();
$news->category->getName();
此代码生成两个查询而不是一个。 为什么?
获取我的 $news
实体后,category
属性仍然是 Doctrine 代理类(Application\Proxies\__CG__\Model\News\Category
)。 \Model\News\Category
的实例仅在获取部分类别数据后才会加载(例如,$news->category->getName()
)并且它正在生成附加 SQL 查询。
如何让 Doctrine 只需一个查询即可下载 \Model\News
并与其关联 \Model\News\Category
?
下面是来自 \Model\News
的 category
字段的配置,带有注释:
/**
* @ManyToOne(targetEntity="\Model\News\Category", inversedBy="news", fetch="EAGER")
*/
public $category;
如您所见...EAGER
不起作用...
最佳答案
将第一行更改为 ->select('n, c')
,以便 Doctrine 能够水合您的新闻和类别实体。
关于php - Doctrine 2 - 加入的实体仍然是代理并在请求后生成两个查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32014720/