Как добавить несколько идентификаторов к элементу в Twig

#php #sql #symfony #twig

#php #sql #symfony #twig

Вопрос:

Мне нужно добавить 2 разных идентификатора из 2 разных таблиц в моей базе данных (чтобы получить всю информацию о каждом id ) в мой URL.

Я получил это исключение:

Ни свойство «car», ни один из методов «car()», «getcar()» /»iscar()» /»hascar()» или «__call()» не существуют и не имеют публичного доступа в классе «App Entity Quote».

Я не разбираюсь, CustomRepository поэтому мне интересно, есть ли другой способ.

Это мой контроллер:

 /**
 * @Route("/individualQuote/{id}", name="user_individualQuote", methods={"GET","POST"})
 **/
public function getIndividualQuote(Prospect $prospect,Car $car): Response
{
    return $this->render('user/_individualQuote.html.twig', [
        'prospect' => $prospect,

    ]);
}

/**
 * @Route("/carInfo/{id}", name="user_carInfo", methods={"GET","POST"})
 **/
public function getQuote(Car $car): Response
{
    return $this->render('user/_individualQuote.html.twig', [
        'car'=>$car

    ]);
}
 

Это мой шаблон twig :

 <ul>
    {% for quote in agency.quotes %}
        {{ dump(quote.prospect.id) }}
        <li><a href="{{ path('user_individualQuote', {id: quote.prospect.id,id:quote.car.id}) }}"> {{ quote.prospect.fullname }}</a></li>
    {% endfor %}

</ul>
 

База данных:
таблица 1 объект car таблица 1

 class Car
{
    /**
     * @ORMId
     * @ORMGeneratedValue
     * @ORMColumn(type="integer")
     */
    private $id;

    /**
     * @ORMColumn(type="string", length=255)
     */
    private $model;

    /**
     * @ORMColumn(type="string", length=255)
     */
    private $brand;

    /**
     * @ORMManyToOne(targetEntity=Prospect::class, inversedBy="cars")
     * @ORMJoinColumn(nullable=false)
     */
    private $prospect;

    /**
     * @ORMColumn(type="smallint")
     */
    private $power;

    /**
     * @ORMColumn(type="string", length=255)
     */
    private $gas;

    /**
     * @ORMColumn(type="string", length=255)
     */
    private $registration;

    /**
     * @ORMColumn(type="boolean")
     */
    private $insuranceExist;

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getModel(): ?string
    {
        return $this->model;
    }

    public function setModel(string $model): self
    {
        $this->model = $model;

        return $this;
    }

    public function getBrand(): ?string
    {
        return $this->brand;
    }

    public function setBrand(string $brand): self
    {
        $this->brand = $brand;

        return $this;
    }

    public function getProspect(): ?Prospect
    {
        return $this->prospect;
    }

    public function setProspect(?Prospect $prospect): self
    {
        $this->prospect = $prospect;

        return $this;
    }

    public function getPower(): ?int
    {
        return $this->power;
    }

    public function setPower(int $power): self
    {
        $this->power = $power;

        return $this;
    }

    public function getGas(): ?string
    {
        return $this->gas;
    }

    public function setGas(string $gas): self
    {
        $this->gas = $gas;

        return $this;
    }

    public function getRegistration(): ?string
    {
        return $this->registration;
    }

    public function setRegistration(string $registration): self
    {
        $this->registration = $registration;

        return $this;
    }

    public function getInsuranceExist(): ?bool
    {
        return $this->insuranceExist;
    }

    public function setInsuranceExist(bool $insuranceExist): self
    {
        $this->insuranceExist = $insuranceExist;

        return $this;
    }

    public function __toString()
    {
        return $this->getBrand() . " " . $this->getModel();
    }
}
 

таблица 2
объект перспективы
таблица 2

 class Prospect
{
    /**
     * @ORMId
     * @ORMGeneratedValue
     * @ORMColumn(type="integer")
     */
    private $id;

    /**
     * @ORMColumn(type="text")
     */
    private $lastName;

    /**
     * @ORMColumn(type="string", length=255)
     */
    private $firstName;

    /**
     * @ORMColumn(type="date")
     */
    private $birthdate;

    /**
     * @ORMColumn(type="string", length=255)
     */
    private $email;

    /**
     * @ORMColumn(type="text", nullable=true)
     */
    private $phoneNumber;

    /**
     * @ORMColumn(type="guid")
     *
     */
    private $guid;

    /**
     * @ORMColumn(type="datetime")
     */
    private $createdAt;

    /**
     * @ORMOneToMany(targetEntity=Car::class, mappedBy="prospect", orphanRemoval=true)
     */
    private $cars;

    /**
     * @ORMOneToMany(targetEntity=Quote::class, mappedBy="prospect")
     */
    private $quotes;

    /**
     * @ORMManyToOne(targetEntity=City::class, inversedBy="prospects")
     * @ORMJoinColumn(nullable=false)
     */
    private $city;

    public function __construct()
    {
        $this->cars = new ArrayCollection();
        $this->quotes = new ArrayCollection();
    }

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getLastName(): ?string
    {
        return $this->lastName;
    }

    public function setLastName(string $lastName): self
    {
        $this->lastName = $lastName;

        return $this;
    }

    public function getFirstName(): ?string
    {
        return $this->firstName;
    }

    public function setFirstName(string $firstName): self
    {
        $this->firstName = $firstName;

        return $this;
    }


    public function getBirthdate(): ?DateTimeInterface
    {
        return $this->birthdate;
    }

    public function setBirthdate(DateTimeInterface $birthdate): self
    {
        $this->birthdate = $birthdate;

        return $this;
    }

    public function getEmail(): ?string
    {
        return $this->email;
    }

    public function setEmail(string $email): self
    {
        $this->email = $email;

        return $this;
    }

    public function getPhoneNumber(): ?string
    {
        return $this->phoneNumber;
    }

    public function setPhoneNumber(?string $phoneNumber): self
    {
        $this->phoneNumber = $phoneNumber;

        return $this;
    }

    public function getGuid(): ?string
    {
        return $this->guid;
    }

    public function setGuid(string $guid): self
    {
        $this->guid = $guid;

        return $this;
    }

    public function getCreatedAt(): ?DateTimeInterface
    {
        return $this->createdAt;
    }

    public function setCreatedAt(DateTimeInterface $createdAt): self
    {
        $this->createdAt = $createdAt;

        return $this;
    }


    /**
     * @ORMPrePersist()
     */
    public function prePersist() {
        $this->setCreatedAt(new DateTime());
    }

    /**
     * @return Collection|Car[]
     */
    public function getCars(): Collection
    {

        return $this->cars;
    }
}
 

Объект цитаты

Цитата

Комментарии:

1. Вы не можете передать один и тот же параметр id дважды. Я рекомендую вам переработать свой код, чтобы иметь более конкретные параметры, например prospect_id , и car_id .

2. когда я меняю свой параметр: "@Route("/individualQuote/{prospect_id}"" и мой шаблон twig: "<a href="{{ path('user_individualQuote', {prospect_id: quote.prospect.id}) }} «Я получил эту ошибку:»Невозможно угадать, как получить экземпляр Doctrine из информации запроса для параметра «перспектива»».

3. Что представляют таблица 1 и таблица 2? Какие объекты?

4. @MAZux я только что отредактировал свой пост: объекты car и prospect

5. Это предложение для конкретного автомобиля? У вас нет никакой связи между Car и предложением, за исключением того, что у них одинаковая перспектива, у которой может быть много каждого. Как вы ожидаете их сопоставления?

Ответ №1:

Если у вас нет прямой связи между двумя объектами, то это пример, который я нашел в документах:

 /**
 * @Route("/blog/{id}/comments/{comment_id}")
 * @Entity("comment", expr="repository.find(comment_id)")
 */
public function show(Post $post, Comment $comment)
{
}
 

Похоже, что автоматически будет найден только первый объект {id} . Вы должны указать, как найти дополнительные объекты.

Попробуйте это:

 /**
 * @Route("/individualQuote/{id}/{car_id}", name="user_individualQuote", methods={"GET","POST"})
 * @Entity("car", expr="repository.find(car_id)")
 */
public function getIndividualQuote(Prospect $prospect, Car $car): Response
{
}
 

И построить путь в twig:

 {{ path('user_individualQuote', {id: prospect.id, car_id: car.id}) }}
 

Комментарии:

1. как вы можете видеть, я использую цикл for . Этот цикл for работает с цитатой agencies.quotes как фильтр потенциальных клиентов в разных агентствах (агентство — это сущность). {id: quote.prospect.id}) }}"> {{ quote.prospect.fullname }} необходимо получить список потенциальных клиентов, которые я хочу.

2. Но я попробовал ваше решение, и я получаю исключение «Переменная «car» не существует».

Ответ №2:

Я не уверен в вашей структуре БД, но из того, что вы показали, я предполагаю, что у вас есть Quote сущность. Чтобы упростить задачу, вы могли бы просто использовать Quote :

 /**
 * @Route("/individualQuote/{id}", name="user_individualQuote", methods={"GET","POST"})
 */
public function getIndividualQuote(Quote $quote): Response
{    

    return $this->render('user/_individualQuote.html.twig', [
        'prospect' => $quote->getProspect(),
        'car'      => $quote->getCar(),    
    ]);
}
 

И в twig:

 {{ path('user_individualQuote', {id: quote.id}) }}
 

Комментарии:

1. на самом деле мне нужно сделать что-то вроде этого: {{ path('user_individualQuote', {id: quote.prospect.car.id}) }} но я получил «Объект App Entity Car, не найденный аннотацией @ParamConverter». исключение