Doctrine2 — какой DQL использовать?

#join #doctrine-orm #dql

#Присоединиться #doctrine-orm #dql

Вопрос:

Первая сущность, вызванная BUNDLE

 /**
 * @var DoctrineCommonCollectionsCollection of AkademieCourseCourse
 * @ManyToMany(targetEntity="AkademieCourseCourse", mappedBy="bundles")
 */
private $courses;
  

Вызывается вторая сущность COURSE

 /**
 * @var DoctrineCommonCollectionsCollection of AkademieBundleBundle
 * @ManyToMany(targetEntity="AkademieBundleBundle", inversedBy="courses")
 */
    private $bundles;

/**
 * @var DoctrineCommonCollectionsCollection of AkademieCourseCourseDate
 * @OneToMany(targetEntity="AkademieCourseCourseDate", mappedBy="course")
 */
    private $courseDates;

/**
 * @var int
 * @Column(type="boolean")
 */
    private $hidden;
  

и третий вызывается COURSEDATE

 /**
 * @var AkademieCourseCourse
 * @ManyToOne(targetEntity="AkademieCourseCourse", inversedBy="courseDates")
 * @JoinColumn(nullable=false)
 */
    private $course;

/**
 * @var DateTime
 * @Column(type="datetimetz", nullable=true)
 */
    private $beginDate;
  

У меня есть параметр course , и мне нужно получить все bundles , что содержит это course . Более того, все остальное courses в этом bundle должно быть courseDate новее текущей даты и не может быть скрыто. В противном случае я не хочу получать этот пакет. Надеюсь, теперь это понятно…

Ответ №1:

В репозитории (например, bundle of entity BUNDLE) вам необходимо создать пользовательский метод :

 public function myMethod($course){
        $qb = $this->createQueryBuilder("b")
                       ->join("b.course", "c")
                       ->join("c.courseDates", "cd")
                       ->Where("c = :course")
                       ->andWhere(" cd.beginDate > :now ")
                       ->andWhere("c.hidden = 1")// if 1 means not hidden
                       ->setParameter(":course", $course)
                       ->setParameter(":now", new DateTime('now'));
  

И затем, в вашем контроллере, вы должны сделать что-то подобное :

 $bundles = $this->getDoctrine()->getManager()->getRepository('namespace of your BUNDLE entity')->myMethod($course);
  

Комментарии:

1. Я пробовал, и дата не влияет. Он все еще дает мне пакеты со старыми курсами.

2. Все мои переменные datetime имеют следующие аннотации: /** * * @var string $subscription_date * * @ORM Column(name=»variable_date», type=»datetime», nullable=false) * @AssertDateTime() **/ private $variable_date; При этом использовании: используйтеSymfony Component Validator Constraints как Assert; и это работает. Я не знаю, как использовать datetimets в symfony, но вы уверены, что данные в вашей базе данных одного типа?