Поиск Symfony, параметр не отправляет - PullRequest
0 голосов
/ 05 мая 2018

мои объекты: реклама - это отношение 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;

1 Ответ

0 голосов
/ 05 мая 2018

Когда вы запрашиваете сущности из базы данных, используя метод Doctrine Entity Manager findBy, данные будут возвращены как ArrayCollection объектов сущностей. Поэтому вы не можете передавать их напрямую в качестве параметра другой функции findBy.

В приведенном вами примере $address представляет собой набор Address экземпляров. Вы можете извлечь массив ID из коллекции и запросить у них Advert. Например:

$searched = $entityManager->getRepository(Advert::class)->findBy(["address" => $addressIds]);

Предположим, что класс Address имеет свойство ключа по умолчанию, называемое id, вы можете извлечь список идентификаторов адресов, используя функцию ArrayCollection.map:

$addressIds = $addresses->map(function($single_address) {
   return $single_address->id;
})

Это один из способов достичь того, что вы пытаетесь сделать. Но не единственный и на самом деле лучший способ.

В основном, если вы делаете bi-directional (2 способа) отношения между Address и Advert сущностью. Вы можете просто получить доступ к списку сущностей Advert, которые связаны с сущностью Address, используя:

$address->adverts

Что я предполагаю, что вы adverts - это свойство класса Address, сопоставленное с классом Advert.

Еще один запрос и установление отношений с Доктриной и Symfony можно найти здесь: https://symfony.com/doc/current/doctrine.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...