如何在一个Action中执行两个存储库函数

时间:2012-11-23 12:52:45

标签: symfony doctrine-orm twig query-builder

我有问题。我想执行这个

$events1 = $em->getRepository('AfishaBundle:Event')->getEvents($this->getCurrentRegion(),'2012-11-12');

//$event_repo->clear();`

$events2 = $em->getRepository('AfishaBundle:Event')->getEvents($this->getCurrentRegion(),'2012-11-13');

foreach($events2 as $event){
            die(var_dump($event->getSeanses()->toArray()));
        }

但是结果返回第一个日期=“2012-11-12” 当我不使用$event_repo->clear();

没关系,但我有 Twig 渲染的问题。 我可以在没有clear()方法的情况下执行此操作吗?如果我不能,请发表评论。

为了完整起见,这是getEvents()代码:

 public function getEvents($region, $date){

    $qb = $this->_em->createQueryBuilder();
    $qb
            ->select('e,s')
            ->from('AfishaBundle:Event', 'e')
            ->leftJoin('e.seanses', 's')
            ->andWhere('s.date = :date')
            ->andWhere('s.region = :region')
            ->setParameter('region', $region)
            ->setParameter('date',$date)
    ;

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

这是EventEventSeans

之间的关系
  /**
* @ORM\OneToMany(
 *     targetEntity="EventSeans",
 *     cascade={"persist", "remove", "merge"},
 *    mappedBy="event"
 *  )
 *  @ORM\OrderBy({"time"= "ASC"})
 */
protected $seanses;

最后,这是EventSeans实体

中的日期字段
/**
 *  @ORM\Column(name="date", type="date")
 */
protected $date;

1 个答案:

答案 0 :(得分:0)

请注意,很难理解你的要求!我知道当你将两个不同的日期传递给getEvents()函数时,你总会得到相同的结果。

您目前发布的代码似乎没问题,但您要做的不是选择Event具有getEvents()功能的实体。

如果您准备好QueryBuilder的查询,则选择EventSeans个实体,以便$ region和$ date是您提供的实体!但您既未选择Event实体,也未涉及EventEventSeans实体之间的关系。

也许有更多细节和对问题的更好解释可能有所帮助。


修改 我认为您不应同时选择EventEventSeanses,因为从repo检索EventSeanses后,您可以从Event实体获取所有Event个对象。但我建议选择所有EventSeanses以满足条件,然后直接从Event对象获取关联的EventSeanses对象。干净又简单。

public function getEventSeanses($region, $date){    
    $qb = $this->_em->createQueryBuilder();
    $qb
            ->select('s')
            ->from('AfishaBundle:EventSeanses', 's')
            ->andWhere("s.date = ':date'")
            ->andWhere('s.region = :region')
            ->setParameter('region', $region)
            ->setParameter('date',$date)
    ;

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

请注意,在SQL中,您应该添加字符串(如日期),如下所示'date',而不仅仅是date

然后,在您的控制器中,您应该执行以下操作:

$events = array();
$region=...
$date=....//year-month-day
$eventseansesList =   $em->getRepository('AfishaBundle:EventSeanses')->getEventSeanses($region,$date);
foreach($eventseansesList as $es){
  $events[] $es->getEvent(); // this function retrieve the Event associated to the EventSeanses
}

PS:您在$seanses中按“时间”而不是“日期”订购Event,这很奇怪!