мои объекты: реклама - это отношение OneToMany к адресу, а адрес - OneToMany с городом. В Городе я получил около 200 городов, из которых пользователь может выбрать 1 из EntityType. Я пытаюсь сделать поисковую систему (?), Чтобы пользователь мог фильтровать рекламу по городам. Я не уверен, что знаю, как это сделать, у моего searchController есть 1 действие:
/**
* @Route("/search/city", name="search_city")
*
* @param Request $request
* @return \Symfony\Component\HttpFoundation\Response
*/
public function searchCityAction(Request $request)
{
$search = new City();
$form = $this->createForm(CityType::class, $search)
->add('submit', SubmitType::class, ["label" => "Szukaj"]);
$entityManager = $this->getDoctrine()->getManager();
if($request->isMethod(Request::METHOD_POST))
{
$form->handleRequest($request);
$selectedCity = ($_REQUEST['city']['city']);
$address = $entityManager->getRepository(Address::class)->findBy(["city" => $selectedCity]);
$searched = $entityManager->getRepository(Advert::class)->findBy(["address" => $address]);
return $this->render("Search/searched.html.twig", ["searched" => $searched]);
}
return $this->render("Search/index.html.twig", ["form" => $form->createView()]);
}
index.html.twig:
{% extends 'base.html.twig' %}
{% block body %}
{{ form(form) }}
{% endblock %}
searched.html.twig:
{% extends 'base.html.twig' %}
{% block body %}
{% for search in searched %}
{{ search.title }}
{% endfor %}
{% endblock %}
В контроллере в $ selectedCity я получил хороший идентификатор города. Но позже как-то параметр отсутствует. В объекте Advert я получил переменную $ address, в address я получил переменную $ city и попытался извлечь это из БД в следующих 2 строках:
$address = $entityManager->getRepository(Address::class)->findBy(["city" => $selectedCity]);
$searched = $entityManager->getRepository(Advert::class)->findBy(["address" => $address]);
но в любом случае это не работает, и я думаю, что много совмещал и потерял здесь
Редактировать
Я пытался сделать это первое решение, но оно не работает. Я изменил свой код как:
if($request->isMethod(Request::METHOD_POST))
{
$form->handleRequest($request);
$selectedCity = ($_REQUEST['city']['city']);
$address = $entityManager->getRepository(Address::class)->findBy(["city" => $selectedCity]);
$addressIds = $address->map(function($single_address) {
return $single_address->id;
});
$searched = $entityManager->getRepository(Advert::class)->findBy(["address" => $addressIds]);
return $this->render("Search/searched.html.twig", ["searched" => $searched]);
}
метод "map" не найден в массиве ...
Ошибка на сайте:
Вызов функции-члена map () для массива
Вот код определения переменных из моих сущностей:
Класс объявления:
/**
* @var Address
*
* @ORM\ManyToOne(targetEntity="Address", inversedBy="adverts", cascade={"persist"})
*/
private $address;
Адрес класса:
/**
* @var Advert[]|ArrayCollection
*
* @ORM\OneToMany(targetEntity="Advert", mappedBy="address")
* @ORM\JoinColumn(name="address_id", referencedColumnName="id")
*/
private $adverts;
/**
* @var City
*
* @ORM\ManyToOne(targetEntity="City", inversedBy="addresses")
*/
private $city;
Городской класс:
/**
* @var Address[]|ArrayCollection
*
* @ORM\OneToMany(targetEntity="Address", mappedBy="city")
* @ORM\JoinColumn(name="city_id", referencedColumnName="id")
*/
private $addresses;