Symfony主义查询构建器查找具有多对一关系的实体

问题描述 投票:1回答:2

我正在与Symfony建立一个项目的网站,该网站的行为类似于“ booking.com”网站,但更为简单,并且会有一些变化。

数据库字段上的一些错误,但对我的问题并不重要。

enter image description here

如您所见,这些表涉及两个实体:公寓和访问。顾客可以要求参观公寓。这是多对一的关系。

我有一个搜索表来搜索带有条件的公寓。我只想显示用户提供的到达和离开日期之间没有任何访问的公寓。因此,我最终在apartmentRepository中创建了一个函数来管理该事件和其他情况。

问题是:如何获得这些公寓?

这里是此函数的草案,它当然还不能完美完成(如果您有任何评论需要改进,那就太好了!)。

public function findByCustom($parameters): ?array
{
   $query =  $this->createQueryBuilder('a');

   foreach ($parameters as $key=> $parameter){
       if($key != 'keywords' and $key!= 'priceMin' & $key!='priceMax' and $key!="typeAp" and $key!="searchVisitDate") $query->orWhere('a.'.$key." = '".$parameter."'");

       if($key == "typeAp")
       {
           $typeApQuery = "";
           foreach ($parameters[$key] as $index => $type)
           {
               if($index !== count($parameters[$key])-1)
               {
                   $typeApQuery.=" a.typeAp = '".$type."' or";
               }
               else
               {
                   $typeApQuery.= " a.typeAp = '".$type."'";
               }
           }
           $query->andWhere($typeApQuery);
       }
   }

   $query->andWhere('a.rentPrice >='.$parameters['priceMin']." and a.rentPrice <= ".$parameters['priceMax']);
   $withoutInner = $query;
   $query
       ->join('App\Entity\Visit', 'v', Join::ON, 'a = v.apartment')
       ->where("v.date between '2020-03-15' and '2020-03-19'");
    $query->getQuery()->getResult();
    $sorted = $withoutInner->andWhere($this->createQueryBuilder('a')->expr()->notIn('a.id', $query));

   return array($sorted);

[公寓当然具有访问的集合,并将访问作为与公寓对象相关的名为”公寓”的字段。

我确实没有找到适当的方法来实现它,我想避免执行SQL,以增进我对Doctrine的理解。

谢谢您的帮助,因为我现在被困住了:/

编辑1:忘了提及我想要的公寓在规定的日期之间没有人来访,或者根本没有人去过]

编辑2:

public function findByCustom($parameters): ?array
{
   $query =  $this->createQueryBuilder('a');
    $withoutInner = $this->createQueryBuilder("a");

   foreach ($parameters as $key=> $parameter){
       if($key != 'keywords' and $key!= 'priceMin' & $key!='priceMax' and $key!="typeAp" and $key!="searchVisitDate")
       {
           $withoutInner->orWhere('a.'.$key." = '".$parameter."'");
           $query->orWhere('a.'.$key." = '".$parameter."'");
       }


       if($key == "typeAp")
       {
           $typeApQuery = "";
           foreach ($parameters[$key] as $index => $type)
           {
               if($index !== count($parameters[$key])-1)
               {
                   $typeApQuery.=" a.typeAp = '".$type."' or";
               }
               else
               {
                   $typeApQuery.= " a.typeAp = '".$type."'";
               }
           }
           $withoutInner->andWhere($typeApQuery);
           $query->andWhere($typeApQuery);
       }
   }

   $query->andWhere('a.rentPrice >='.$parameters['priceMin']." and a.rentPrice <= ".$parameters['priceMax']);
   $withoutInner->andWhere('a.rentPrice >='.$parameters['priceMin']." and a.rentPrice <= ".$parameters['priceMax']);
   $query
       ->join('App\Entity\Visit', 'v', Join::WITH, 'a.id = v.apartment')
       ->where("v.date between '2020-03-15' and '2020-03-19'");

    $query->getQuery()->getResult();
    $sorted = $withoutInner->andWhere($this->createQueryBuilder('a')->expr()->notIn('a.id', $query));

使用此功能,我会出现教义错误:

Error: Method Doctrine\Common\Collections\ArrayCollection::__toString() must not throw an exception, caught ErrorException: Catchable Fatal Error: Object of class Doctrine\ORM\EntityManager could not be converted to string

我正在用Symfony构建一个网站,该项目的工作方式类似于“ booking.com”网站,但非常简单,并且会有一些变化。数据库字段上的一些错误,但不是很重要...

php symfony doctrine symfony4 query-builder
2个回答
1
投票

我自己还没有测试过,但是类似的东西应该可以工作:


0
投票

我找到了一个解决方案,可以使所有没有租金的公寓(联接为空)。是的,我更改了租金访问,因为这是我的主要问题。

© www.soinside.com 2019 - 2024. All rights reserved.