0

如何使用 DQL 获取对象并正确获取所有字段和引用?当我使用以下语句获取实体列表时:

return $this->orm->createQuery('SELECT pp FROM PagePlugin pp where pp.page = :page')->setParameter('page', $page)->getResult();

我将获得一个 PagePlugins 列表,其中每个PagePlugin都有一个对 a 的引用Plugin

/**
 * @var \Plugin
 *
 * @ORM\ManyToOne(targetEntity="Plugin", inversedBy="pagePlugin", cascade={"persist"})
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="plugin_id", referencedColumnName="plugin_id", onDelete="CASCADE")
 * })
 */
private $plugin;

迭代结果时,Plugin链接到 PagePlugins 的实体没有名称:

$pagePlugin->getPlugin()
DoctrineProxies\__CG__\Plugin::__set_state(array(
   '__initializer__' => 
  Closure::__set_state(array(
  )),
   '__cloner__' => 
  Closure::__set_state(array(
  )),
   '__isInitialized__' => false,
   'pluginId' => 7,
   'pluginName' => '',
   'pagePlugin' => NULL,
   'pluginMappingValue' => '',
   'allowedPlugin' => 0,
   'mainEntity' => 0,
   'autoCompleteIgnorePlugin' => 0,
))

当我刷新对象时:

        $ref = $pagePlugin->getPlugin();
        $test = ORM::getDefaultOrm();
        $test->refresh($ref);

将获取名称:

$ref = {DoctrineProxies\__CG__\Plugin} [11]
 lazyPropertiesDefaults = {array} [0]
 __initializer__ = {Closure} [3]
 __cloner__ = {Closure} [3]
 __isInitialized__ = true
 *Plugin*pluginId = 7
 *Plugin*pluginName = "Header"
 *Plugin*pagePlugin = {Doctrine\ORM\PersistentCollection} [9]
 *Plugin*pluginMappingValue = "Header"
 *Plugin*allowedPlugin = null
 *Plugin*mainEntity = null
 *Plugin*autoCompleteIgnorePlugin = null

是否可以在 DQL 中指定 Doctrine 必须完全获取插件,为什么 Doctrine 会部分获取该对象?

4

1 回答 1

3

如果你也想获取,Plugin你需要做一个所谓的获取连接。您可以在 Doctrine2 文档第14.2.2章中阅读 fetch join here。加入

Fetch Joins:除了使用常规连接之外:用于获取相关实体并将它们包含在查询的水合结果中。

在您的情况下,您应该使用查询来执行获取连接:

$this->orm->createQuery('SELECT pp, p FROM PagePlugin pp JOIN pp.plugin p WHERE pp.page = :page')->setParameter('page', $page)->getResult();
于 2017-01-16T10:44:18.590 回答