scorpion-ds
Новичок
Не понимаю, почему я раньше не сталкивался с такой проблемой ...
Столкнулся с проблемой, что если делаю запрос в репозитории к таблице у которой есть связи и связанные объекты явно запрашиваются, то ограничение setMaxResults действует не только на родителя, но и на дочерние объекты. К примеру, если Messages в выборке у меня 10, но есть еще дочерние объекты MessageCustomer, которых скажем 3 на все Messages, то я получу только 7 результатов по родительскому объекту. Я не понимаю почему setMaxResults действует на все связанные сущности, а не только на родительскую.
Если я уберу явную связь и будет использоваться "ленивая загрузка", то будет масса лишних запросов, но все будет работать как надо.
Фрагмент кода, он порезан немного, что бы не отвлекать от сути вопроса:
Столкнулся с проблемой, что если делаю запрос в репозитории к таблице у которой есть связи и связанные объекты явно запрашиваются, то ограничение setMaxResults действует не только на родителя, но и на дочерние объекты. К примеру, если Messages в выборке у меня 10, но есть еще дочерние объекты MessageCustomer, которых скажем 3 на все Messages, то я получу только 7 результатов по родительскому объекту. Я не понимаю почему setMaxResults действует на все связанные сущности, а не только на родительскую.
Если я уберу явную связь и будет использоваться "ленивая загрузка", то будет масса лишних запросов, но все будет работать как надо.
Фрагмент кода, он порезан немного, что бы не отвлекать от сути вопроса:
PHP:
public function getMessagesAccount(
Account $account,
array $filters = [],
string $search = null,
string $sortField = null,
string $sortOrder = null,
int $offset = 0,
int $limit = null,
bool $notActivity = null,
int $customerId = null,
bool $isOpen = null,
bool $isDownloaded = null,
$hydrationMode = AbstractQuery::HYDRATE_OBJECT
)
{
$qb = $this->createQueryBuilder('m')
->select('m')
;
$qb
->innerJoin('CPMessageBundle:MessageCustomer', 'mc', 'WITH', 'mc.message = m.id')
//->join('CPCustomerBundle:Customer', 'c', 'WITH', 'c.id = mc.customer')
//->leftJoin('CPDocumentBundle:Link', 'l', 'WITH', 'l.messageCustomer = mc.id')
//->leftJoin('CPFilesBundle:FileLink', 'fl', 'WITH', 'fl.messageCustomer = mc.id')
//->leftJoin('CPUrlBundle:UrlLink', 'url_link', 'WITH', 'url_link.messageCustomer = mc.id')
;
$qb
->where($qb->expr()->eq('m.account', ':account'))
->setParameter('account', $account->getId())
;
// Filters <<
$this->andFilters($qb, 'm', $filters);
// Filters >>
// Sorting <<
$this->sorting($qb, 'm', $sortField, $sortOrder);
// Sorting >>
if(!empty($limit))
{
$qb
->setFirstResult($offset)
->setMaxResults($limit)
;
}
return $qb->getQuery()->getResult($hydrationMode);