#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, но вы уверены, что данные в вашей базе данных одного типа?