bars80081
Новичок
Добрый день,
преследую фундаментальный вопрос: как ЭТО правильно сделать?
по мотивам Создание блога на Symfony 2.8 lts пытаюсь понять практическую пользу symfony.
Имеется блог, в котором есть сущности Блог и Комментарии, а также БлогРепозиторий. в репозитории задаётся метод на получение последних записей из блога. по задаче мы хотим также указать число комментариев к данному блогу. в статье предлагается такой вариант:
до появления необходимости указать число комментариев к записи в блоге всё шло отлично. но тут автор со своим leftJoin предлагает очевидный перерасход ресурсов, так как он выбирает все комментарии, относящиеся к записи в блоге только для того, чтобы потом посчитать их число.
захотелось мне сделать это отдельным запросом, но не так всё оказалось просто. то ли опять не нашёл в документации волшебного объяснения как всё сделать просто, то ли в принципе осуществляю неправильный подход. в итоге пришёл к такому виду:
что мне не нравится по ряду моментов. в итоге возникли следующие вопросы:
1. пытался построить через createQueryBuilder - не удалось. можно ли через него собрать свободный запрос или он в принципе работает только с тем, что правильно оформлено в виде Entities и Repositories?
2. не получилось запросить данные сторонней сущности. $this->createQueryBuilder('c')->select('c') всё равно возвращают записи блога, а не комментариев. могу ли я через createQueryBuilder обратиться к сущности без необходимости начинать запрос с сущности блога и далее по взаимным связям?
3. не удалось прямо указать таблицу в FROM, createQuery требует указать класс сущности. получается, что без класса сущности я в принципе не могу построить запрос?
4. указание Blogger\BlogBundle\Entity\Comment как-то слишком длинно и зависимо от файловой системы. сами то через createQueryBuilder проще находят, что значит b и c. можно ли как-то указать что ли пространство имён в котором работаю заранее? и далее слать запросы с указанием коротких имён классов?
5. почему не удаётся в запросе прописать SELECT COUNT(*)? почему ругается на звёздочку?
6. почему не удаётся в запросе прописать `? почему ругается на апостроф? как он разбирает где служебные слова, а где имена полей?
ну и фундаментальный вопрос:
7. как ЭТО было бы правильно сделать?
спасибо
преследую фундаментальный вопрос: как ЭТО правильно сделать?
по мотивам Создание блога на Symfony 2.8 lts пытаюсь понять практическую пользу symfony.
Имеется блог, в котором есть сущности Блог и Комментарии, а также БлогРепозиторий. в репозитории задаётся метод на получение последних записей из блога. по задаче мы хотим также указать число комментариев к данному блогу. в статье предлагается такой вариант:
PHP:
namespace Blogger\BlogBundle\Entity\Repository;
/**
* BlogRepository
*
* This class was generated by the Doctrine ORM. Add your own custom
* repository methods below.
*/
class BlogRepository extends \Doctrine\ORM\EntityRepository
{
public function getLatestBlogs($limit = null)
{
$qb = $this->createQueryBuilder('b')
->select('b, c')
->leftJoin('b.comments', 'c')
->addOrderBy('b.created', 'DESC');
if(false === is_null($limit)) {
$qb->setMaxResults($limit);
}
$result = $qb->getQuery()->getResult();
return $result;
}
}
захотелось мне сделать это отдельным запросом, но не так всё оказалось просто. то ли опять не нашёл в документации волшебного объяснения как всё сделать просто, то ли в принципе осуществляю неправильный подход. в итоге пришёл к такому виду:
PHP:
$qb = $this->createQueryBuilder('b')
->select('b, c')
->leftJoin('b.comments', 'c')
->addOrderBy('b.created', 'DESC');
if(false === is_null($limit)) {
$qb->setMaxResults($limit);
}
$result = $qb->getQuery()->getResult();
$idis = array();
foreach($result as $key => $bg) {
$id = $bg->getId();
$idis[] = $id;
}
if($idis) {
$qc = $this->_em->createQuery('SELECT COUNT(c.id) cnt, c.blog_id FROM Blogger\BlogBundle\Entity\Comment AS c WHERE c.blog_id IN (?1) GROUP BY c.blog_id')
->setParameter(1, $idis);
$qr = $qc->getResult();
dump($qr);
}
1. пытался построить через createQueryBuilder - не удалось. можно ли через него собрать свободный запрос или он в принципе работает только с тем, что правильно оформлено в виде Entities и Repositories?
2. не получилось запросить данные сторонней сущности. $this->createQueryBuilder('c')->select('c') всё равно возвращают записи блога, а не комментариев. могу ли я через createQueryBuilder обратиться к сущности без необходимости начинать запрос с сущности блога и далее по взаимным связям?
3. не удалось прямо указать таблицу в FROM, createQuery требует указать класс сущности. получается, что без класса сущности я в принципе не могу построить запрос?
4. указание Blogger\BlogBundle\Entity\Comment как-то слишком длинно и зависимо от файловой системы. сами то через createQueryBuilder проще находят, что значит b и c. можно ли как-то указать что ли пространство имён в котором работаю заранее? и далее слать запросы с указанием коротких имён классов?
5. почему не удаётся в запросе прописать SELECT COUNT(*)? почему ругается на звёздочку?
6. почему не удаётся в запросе прописать `? почему ругается на апостроф? как он разбирает где служебные слова, а где имена полей?
ну и фундаментальный вопрос:
7. как ЭТО было бы правильно сделать?
спасибо