我正在与Symfony建立一个项目的网站,该网站的行为类似于“ booking.com”网站,但更为简单,并且会有一些变化。
数据库字段上的一些错误,但对我的问题并不重要。
如您所见,这些表涉及两个实体:公寓和访问。顾客可以要求参观公寓。这是多对一的关系。
我有一个搜索表来搜索带有条件的公寓。我只想显示用户提供的到达和离开日期之间没有任何访问的公寓。因此,我最终在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”网站,但非常简单,并且会有一些变化。数据库字段上的一些错误,但不是很重要...
我自己还没有测试过,但是类似的东西应该可以工作:
我找到了一个解决方案,可以使所有没有租金的公寓(联接为空)。是的,我更改了租金访问,因为这是我的主要问题。