Я использую Symfony 2.0.10 с Doctrine 2.1 и имею довольно простой запрос (см. ниже), где я хочу кэшировать результаты с помощью APC (версия 3.1.7, с поддержкой 1 ГБ памяти) через useResultCache(true, 600)
и сохранять режим гидратации как \Doctrine\ORM\Query::HYDRATE_OBJECT
.
Проблема в том, что отношения Many-to-Many (Doctrine\ORM\PersistentCollection
) не кэшируются, и каждый раз, когда основные результаты запроса кэшируются, объединенные объекты устанавливаются на null
. Тот же запрос хорошо кэшируется в APC, когда я устанавливаю режим гидратации на \Doctrine\ORM\Query::HYDRATE_ARRAY
, но это не приемлемое решение для меня, потому что я не могу повторить многие шаблоны для этого.
Пожалуйста, предложите, как я могу кэшировать все свойства объединенных объектов в APC? Пожалуйста, не указывайте на документацию, потому что я думаю, что я научился наизусть, пытаясь решить эту проблему:)
CODE:
$property = $em
->createQueryBuilder()
->select('p,u')
->from('MyBundle:Property', 'p')
->leftJoin('p.users', 'u')
->where('p.id in (:id)')
->setParameter('id', 123)
->getQuery()
->useResultCache(true, 60)
->setHydrationMode(\Doctrine\ORM\Query::HYDRATE_OBJECT)
->getResult();
User.php
class User {
/**
* @ORM\ManyToMany(targetEntity="Property", mappedBy="users", cascade={"all"}, fetch="EAGER")
*/
protected $properties;
}
Property.php
class Property {
/**
* @ORM\ManyToMany(targetEntity="User", inversedBy="properties", cascade={"all"}, fetch="EAGER")
* @ORM\JoinTable(name="user_property",
* joinColumns={@ORM\JoinColumn(name="property_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")}
* )
*/
protected $users;
}