【发布时间】:2020-03-19 01:04:17
【问题描述】:
我正在使用 Symfony 为一个项目构建一个网站,该项目的行为类似于“booking.com”网站,但更简单且有一些变化。
数据库字段上的一些错误,但对我的问题并不重要。
如您所见,这些表涉及两个实体:公寓和访问。 客户可以要求参观公寓。这是多对一的关系。
我有一个搜索表单来搜索符合条件的公寓。我只想显示在用户提供的到达和离开日期之间没有任何访问的公寓。 所以我最终在 apartmentRepository 中创建了一个函数来管理这种情况和其他情况。
问题是:我怎样才能得到这些公寓?
这里是这个功能的一个草稿,当然没有完成也不完美(如果你有一些cmet来改进它,那就太好了!)。
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);
当然,apartment 有一个访问的集合,并且作为一个名为“apartment”的字段访问,它与公寓对象相关。
我真的没有找到合适的方法来做这件事,我想避免做 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
【问题讨论】:
-
你加入到访中,选择那些在那个时间段内根本没有访客的公寓。使用日期时间而不是日期时可能会出现问题。同样
$query是一个对象,所以$withoutInner将在$query被修改时被修改。改进建议:更短的行。 -
哦,是的,我没想到这一点。我的意思是不必重新输入该行,但我会这样做。我会尝试一下,如有任何问题会与您联系 :) 如果您可以提供转换为您所说内容的代码,即使我要自己搜索也会很棒 :)
标签: php symfony doctrine symfony4 query-builder