Я пытаюсь использовать кэш доктрины из Common package, но я не могу заставить его работать с односторонними, много-к-одному. Я объясню позже, что я хочу сделать.
Моя конфигурация:
'configuration' => array(
'orm_default' => array(
'metadata_cache' => 'filesystem',
'query_cache' => 'filesystem',
'result_cache' => 'filesystem',
'hydration_cache' => 'filesystem',
)
),
Моя сущность
class Category
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*
* @var string
*/
protected $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=100, nullable=false)
*/
protected $name;
/**
* @var integer
*
* @ORM\ManyToOne(targetEntity="Category", inversedBy="childrenId", fetch="EAGER")
* @ORM\JoinColumn(name="parent_id", referencedColumnName="id")
*/
protected $parentId;
/**
* @ORM\OneToMany(targetEntity="Category", mappedBy="parentId", fetch="EAGER")
*/
protected $childrenId;
}
My DQL
$result = $this->em->createQueryBuilder()->select('c')
->from('App\Entity\Category', 'c')
->where('c.parentId IS NULL')
->orderBy('c.priority', 'ASC')
->getQuery()
->setFetchMode("App\Entity\Category", "parentId", \Doctrine\ORM\Mapping\ClassMetadata::FETCH_EAGER);
->useResultCache(true, 900, 'categories')
->getResult();
У меня 28 категорий, 15 у них есть parentId.
Над запросом выполняется 29 SQL-запросов, но хранилище Doctrine только в кеше 1. Поэтому, когда я снова запускаю этот запрос, он выполняет 28 запросов.
Любая идея, что я делаю неправильно? отсутствует некоторая конфигурация кеша? Отсутствуют некоторые методы в DQL? Я хотел бы кэшировать все запросы не только с одним основным запросом.
Edit
Я хотел бы использовать результат запроса в цикле, например:
foreach($result as $row)
{
$categories[]['attr'] = $row->getAttribute()->getName();
$categories[]['value'] = $row->getAttribute()->getValue();
}
но в этом случае кеш не будет работать, поэтому в настоящее время я использую:
foreach($result as $row)
{
$attributes = $this->em->createQueryBuilder()->select('c, a.name, a.value')
->from('App\Entity\Category', 'c')
->innerJoin('App\Entity\Attribute', 'a', 'WITH', 'a.id = c.attribute')
->where('c.id = :catId')
->setParameter('catId', $row['id'])
->getQuery()
->useResultCache(true, 900, $categoryName.'-attributes')
->getArrayResult();
}
Но я предпочел бы работать с объектами, а затем на массивах, но я не могу исключить, использую ли я объект и имеет ассоциацию, тогда эта ассоциация не будет кэшироваться. Поэтому идеально было бы каким-то образом кэшировать объект + ВСЕ его ассоциации.