Doctrine 2 - 加入的实体仍然是代理并在请求后生成两个查询
Doctrine 2 - Joined entity is still a proxy and generating two queries after request
$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 代理 class (Application\Proxies\__CG__\Model\News\Category
)。 \Model\News\Category
的实例将仅在获取一些类别数据(例如 $news->category->getName()
)并生成 additional 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 将滋润您的新闻和类别实体。
$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 代理 class (Application\Proxies\__CG__\Model\News\Category
)。 \Model\News\Category
的实例将仅在获取一些类别数据(例如 $news->category->getName()
)并生成 additional 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 将滋润您的新闻和类别实体。