Symfony2 Doctrine2 получить результат, используя критерии со вторым отношением - PullRequest
0 голосов
/ 02 декабря 2018

Я хотел бы спросить: существует ли какой-либо простой способ получения данных с условиями во втором отношении.

В моем контроллере я получаю каждую категорию сущности.

В каждой категории много продуктов, поэтомуЭто отношение "OneToMany".Далее у каждого продукта есть автор, и есть отношение «ManyToOne».

Теперь я хотел бы получить каждую категорию, которая включает продукты, которые активны, а автор которых активен.

категория Продукт OneToMany Продукт продукта ManyToOne имеет поле «активный» Автор имеет поле «активный»

Мой метод получения продуктов в категории объекта.

    public function getProducts()
{
    $criteria = Criteria::create();
    $criteria->where(Criteria::expr()->eq('isVisible', true));
    $criteria->andWhere(Criteria::expr()->eq('isActive', true));

    return $this->products->matching($criteria);
}

1 Ответ

0 голосов
/ 03 декабря 2018

Когда вы звоните getProducts(), Doctrine получает все записи из базы данных и выбирает продукты, соответствующие вашим критериям.Пока это работает, лучше использовать вашу базу данных (MySQL?), Чтобы выбрать правильные записи.

Так что используйте QueryBuilder вместо этого.А поскольку вы Symfony, создайте эти методы в репозитории .

Мы здесь не для того, чтобы писать ваш код, но чтобы дать вам идею, это может быть что-то вроде этого:

CategoryRepository.php

use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\ORM\Query\Expr\Join;

class CategoryRepository extends ServiceEntityRepository
{
    public function __construct(RegistryInterface $registry)
    {
        parent::__construct($registry, Category::class);
    }

    public function findActiveCategories()
    {
        $qb = $this->createQueryBuilder('Category')
            ->innerJoin(
                'AppBundle:Product',
                'Product',
                Join::WITH,
                'Category.id = Product.category'
            )
            ->where('Product.isActive = 1')
        ;

        return $qb->getQuery()->getResult();
    }
}
...