#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
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();
}
}
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». исключение