Doctrine DQL, правильное извлечение всего объекта со всеми ссылками и полями

Как вы можете получить объект с помощью DQL и правильно получить все поля и ссылки? Когда я использую следующий оператор для получения списка сущностей:

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

Я получу список PagePlugins, где каждый PagePlugin имеет одну ссылку на 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 получает этот объект частично?


person Laurence    schedule 16.01.2017    source источник


Ответы (1)


Если вы хотите также получить Plugin, вам нужно выполнить так называемое объединение выборки. Вы можете прочитать о присоединении к выборке здесь, в главе документации Doctrine2 14.2.2. Присоединяется:

Выборка соединений. В дополнение к использованию обычных соединений: используется для выборки связанных сущностей и включения их в расширенный результат запроса.

В вашем случае вы должны использовать запрос как таковой для выполнения выборки:

$this->orm->createQuery('SELECT pp, p FROM PagePlugin pp JOIN pp.plugin p WHERE pp.page = :page')->setParameter('page', $page)->getResult();
person Wilt    schedule 16.01.2017