Сериализованные прокси-классы Doctrine 2

Есть ли возможность получить "полный" объект с ассоциациями вместо прокси-классов в доктрине 2?

Потому что я сериализую объект (и отношения), но когда я десериализую, я просто возвращаю прокси-класс.

Запрос, который я делаю:

public function getSnippet($id)
    {
        return $this->getEntityManager()->getRepository('GvnSnippetryBundle:Snippet')->findOneBy(array('id' => $id));
    }

person Vince V.    schedule 02.09.2011    source источник


Ответы (2)


Никогда не пробовал это лично (и у меня нет под рукой Doctrine2), но отметка ассоциации как EAGER должна помочь. Однако вы всегда будете загружать связанные объекты таким образом.

В качестве обходного пути попробуйте получить доступ к связанным сущностям перед сериализацией. Например. если вы следовали совету инкапсулировать коллекцию связанных объектов (и вам действительно следует следовать ему), вы просто получаете к нему доступ с помощью $snippet->howDidYouCallFunctionThatReturnCollection(). Doctrine перехватывает запрос к Collection, проверяет, заполнен ли он прокси и загружает его автоматически. Итак, это должно быть что-то вроде:

class Snippet{
     //other declarations
    /** OneToMany(targetEntity='Blah', ...)*/
    protected $associations;

    public function getAssociations(){
        return $this->associations; //fills proxies with real data here
    }
}

public function getSnippet($id)
{
    $snippet = $this->getEntityManager()->getRepository('GvnSnippetryBundle:Snippet')->findOneBy(array('id' => $id));
    $snippet->getAssociations(); //gets only one association
    $snippet->getAssociations2(); //and so on
    return $snippet;
}

Обратите внимание, что это не полный пример кода, но я предполагаю, что вы знаете, как отображать ассоциации. В любом случае просмотрите Работа с объектами и сопоставление ассоциаций главы для более подробного описания и примеров кода.

person J0HN    schedule 02.09.2011

Ответ J0HN хорош.

Если вы хотите быть более сфокусированным, вы можете заставить Doctrine выполнять выборку-объединение связанных сущностей, создав собственный запрос (либо непосредственно в DQL, либо с помощью QueryBuilder). Чтобы принудительно загрузить ассоциацию, вам нужны оба:

1) Присоединиться к связанному объекту 2) Указать этот объект в SELECT

Итак, в DQL:

SELECT f 
FROM Foo f
JOIN f.Bar b

Это не загрузит связанную панель, так как она не указана в SELECT — вместо этого вы получите прокси, в то время как

SELECT f, b
FROM Foo f
JOIN f.Bar b

заставит доктрину присоединиться к вашим барам.

ХТН

person timdev    schedule 02.09.2011
comment
о, спасибо за отличный совет! как раз то, что мне было нужно! - person Vince V.; 03.09.2011