Я создаю веб-сайт с 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));
С помощью этой функции я получаю doctrine ошибку:
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