J'ai une page qui affiche des informations sur un film. Je récupère dans GET l'identifiant du film. Ce que je voudrais faire, c'est récupérer les commentaires pour chaque film (il y a une colonne filmId dans mon tableau liée à l'id principal de la table film)
/**
* @Route("/user/film/{id}", name="film")
*/
public function film(FilmRepository $repo, CommentRepository $comRepo, EntityManagerInterface $em, Request $req, $id) { $film = $repo->find($id);
$comments = $comRepo->findBy(array('id' => $id)); return $this->render('film/film.html.twig', [
'controller_name' => 'FilmController',
'film' => $film, 'comments' => $comments
]);
}
quand je fais un $comments = $comRepo-> findBy (array ('id' => $ id)); Je reçois quelques commentaires, mais en fonction de leur identifiant et NON de l'identifiant du film (le commentaire avec l'identifiant 1 sera affiché sur le film avec l'identifiant 1, mais par exemple un commentaire avec l'identifiant 4 et le filmId a 1 n'apparaîtra pas sur le film 1 , mais sur le film avec id 4)
J'ai essayé d'accéder au champ filmId en faisant simplement un $ comments =$comRepo->findBy(array ('filmId' => $id)); mais j'obtiens l'erreur:
Une exception s'est produite lors de l'exécution de 'SELECT t0.id AS id_1, t0.content AS content_2, t0.created_at AS created_at_3, t0.author_id AS author_id_4 FROM comment t0 WHERE comment_film.film_id =?' avec les paramètres ["1"]: SQLSTATE [42S22]: Colonne non trouvée: 1054 Colonne inconnue 'comment_film.film_id' dans 'clause where'
J'ai essayé une demande personnalisée avec, dans mon référentiel de commentaires:
public function findAllWithFilmId($filmId) { $em = $this->getEntityManager(); $query = $em->createQuery( 'SELECT c FROM App\Entity\Comment c WHERE c.filmId = :filmId' )->setParameter('filmId', $filmId);
return $query->getResult();
}
Mais cela ne semble pas fonctionner.
Où dois-je faire une telle demande? Comment modifier la requête, qui semble erronée, de symfony sans tout désorganiser? ou existe-t-il une meilleure méthode pour corriger le problème?
Ceci est mon entité de commentaire
<?php
namespace App\Entity;
use App\Entity\Film;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass="App\Repository\CommentRepository")
*/
class Comment
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="comments")
* @ORM\JoinColumn(nullable=false)
*/
private $author; /** * @ORM\ManyToMany(targetEntity="App\Entity\Film", inversedBy="comments") * @ORM\JoinColumn(nullable=false) */ private $filmId;
/**
* @ORM\Column(type="text")
*/
private $content; /** * @ORM\Column(type="datetime") */ private $createdAt;
public function getId(): ?int
{
return $this->id; } public function getAuthor(): ?User { return $this->author;
}
public function setAuthor(?User $author): self { $this->author = $author; return $this;
}
public function getFilmId(): ?Film
{
return $this->filmId; } public function setFilmId(?Film $filmId): self
{
$this->filmId = $filmId;
return $this; } public function getContent(): ?string { return $this->content;
}
public function setContent(string $content): self { $this->content = $content; return $this;
}
public function getCreatedAt(): ?\DateTimeInterface
{
return $this->createdAt; } public function setCreatedAt(\DateTimeInterface $createdAt): self
{
$this->createdAt = $createdAt;
return $this;
}
}
Je pense qu'il est possible que l'erreur vienne d' annotations , car en partant de symfony pendant le make: entity, j'ai défini des relations de types que j'ai corrigées plus tard dans phpmyadmin, mais pas le code. Par exemple, nous pouvons voir que filmId est dans ManyToMany, mais je pense qu'il devrait être dans OneToOne (FilmId ne peut avoir qu'un seul identifiant et un identifiant ne peut correspondre qu'à un filmId), mais j'ai peur que si je change certaines choses, cela se brise tout .
Si vous avez correctement configuré vos relations ORM, cela devrait être aussi simple que:
$film = $repo->find($id); $comments = $film->getComments();
Il vous manque peut-être un mappage dans Film.php.
Voici un exemple XML, qui devrait être assez facile à convertir en annotations:
Dans le film:
<one-to-many field="comments" target-entity="App\...\Comments" mapped-by="film"/>
Dans les commentaires:
<many-to-one field="film" target-entity="App\...\Film" inversed-by="comments"/>
Tout d'abord, je vous conseille d'en savoir plus sur les relations entre entités .
Car, les annotations actuelles disent que vous pouvez avoir beaucoup de commentaires sur de nombreux films. Ce n'est pas vrai. Un commentaire peut appartenir à un film. Un film peut avoir de nombreux commentaires.
En outre, je tiens à noter que, pour autant que je sache, @JoinColumn devrait être dans une entité enfant, c'est-à-dire où le lien vers FK est contenu. Par conséquent, vos entités devraient ressembler à ceci:
Commentaire:
<?php
namespace App\Entity;
use App\Entity\Film;
use DateTimeInterface;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass="App\Repository\CommentRepository")
*/
class Comment
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id; /** * @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="comments") */ private $author;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Film", inversedBy="comments")
* Here we set property for our table and property of foreign table to map our comment to the right film
* nullable, because comment couldn't be without film
* @ORM\JoinColumn(name="film_id", referencedColumnName="id", nullable=false)
*/
private $film; /** * @ORM\Column(type="text") */ private $content;
/**
* @ORM\Column(type="datetime")
*/
private $createdAt; public function getId(): ?int { return $this->id;
}
public function getAuthor(): ?User
{
return $this->author; } public function setAuthor(?User $author): self
{
$this->author = $author;
return $this; } public function getFilmId(): ?Film { return $this->filmId;
}
public function setFilmId(?Film $filmId): self { $this->filmId = $filmId; return $this;
}
public function getContent(): ?string
{
return $this->content; } public function setContent(string $content): self
{
$this->content = $content;
return $this; } public function getCreatedAt(): ?DateTimeInterface { return $this->createdAt;
}
public function setCreatedAt(DateTimeInterface $createdAt): self { $this->createdAt = $createdAt; return $this;
}
}
Film:
<?php
namespace App\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass="App\Repository\FilmRepository")
*/
class Film
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id; /** * @ORM\OneToMany(targetEntity="App\Entity\Comment", mappedBy="film") */ private $comments;
public function __construct()
{
$this->comments = new ArrayCollection(); } public function getId() { return $this->id;
}
public function setId($id) { $this->id = $id; return $this;
}
public function getComments(): Collection
{
return $this->comments; } public function setComments(Collection $comments): Film
{
$this->comments = $comments;
return $this;
}
}
Alors, maintenant, vous pouvez récupérer vos commentaires via:
/**
* @Route("/user/film/{id}", name="film")
*/
public function film($id)
{
/** @var null|EntityManager $entityManager */ $entityManager = $this->get('doctrine.orm.entity_manager'); if (null == ($film = $entityManager->getRepository(Film::class)->find($id))){
throw new NotFoundHttpException('Film not found');
}
$comments = $film->getComments();
return $this->render('film/film.html.twig', [ 'film' => $film,
'comments' => $comments
]);
}
Jana Duggar a été ouverte sur sa recherche de l'amour. Voici tout ce qu'elle a dit sur le sujet et sa fenêtre de mariage de cinq ans.
La star d'Outlander, Sam Heughan, a récemment révélé ce qu'il retirera du tournage pour se souvenir de Jamie Fraser, le rôle qui a fait de lui une star.
"She Loves You" a été écrite en une heure, enregistrée en une journée, et a été la chanson des Beatles avec l'une de leurs meilleures performances de leur carrière.
Dolly Parton et sa grand-mère Bessie avaient une relation spéciale. Grand-mère Parton était très malade, mais cela n'a pas empêché Dolly de lui faire des farces.
Vous pensez peut-être que le chêne ou le noyer sont résistants, mais en matière de bois les plus durs au monde, ils sont loin derrière.
L'océan regorge de beauté, mais il abrite aussi certaines des créatures marines les plus terrifiantes de la planète. Nombre de ces animaux vivent dans les profondeurs obscures et sous haute pression des abysses.
Que vous affrontiez des créatures hostiles ou vous prépariez pour des affrontements PvP, connaître les meilleurs enchantements d'épée dans Minecraft peut vous donner un avantage considérable. Enchanter vos épées vous permet d'infliger plus de dégâts, d'augmenter le butin des créatures et d'accroître leur durabilité.
Quand on parle de pays socialistes, on imagine souvent un contrôle total de l'État et l'absence de propriété privée. Mais en réalité, les économies socialistes sont très diverses.
« Enfants » laisse tomber un caméo de grand nom et des nouvelles dévastatrices
Ce RAV4 est déclaré en excellent état et est prêt pour un jeu de chaises musicales.
Des images de drones ont montré des pompiers semblant lutter pour éteindre l'incendie.
Eyes of Wakanda est directement lié au MCU, ainsi que des mises à jour sur X-Men '97, What If..., Daredevil, et plus encore.
Ava Gardner a été mariée à Mickey Rooney et Frank Sintra, et a fréquenté plusieurs autres stars d'Hollywood. Voici un aperçu de l'histoire amoureuse d'Ava Gardner.
John Cleese a épousé sa femme, Jennifer Wade, en 2012. Voici tout ce qu'il faut savoir sur la femme de John Cleese, Jennifer Wade.
Craig Melvin a épousé la présentatrice sportive Lindsay Czarniak en 2011. Voici tout ce qu'il faut savoir sur la femme de Craig Melvin.
Maggie Gyllenhaal et Peter Sarsgaard se sont mariés en 2009 et partagent deux filles ensemble. Voici une chronologie complète de leur relation.
Ça me frappe tout à coup, comme c'est si souvent le cas C'est à nouveau le milieu du chemin <Non, pas celui du Pacifique, toi marron, celui du carnaval> Chaque gros titre fort… ..
En 2022, avec la sortie de GPT-3, la compétence en écriture semble devenir moins importante. Avec l'IA, les personnes ayant une mauvaise écriture peuvent également générer du personnel de qualité.
Dans le monde rapide et compétitif d'aujourd'hui, la carrière d'une personne joue un rôle important dans la croissance personnelle, la stabilité financière et la satisfaction globale de la vie. Cependant, de nombreuses personnes se retrouvent prises dans un cycle incessant de stagnation et d'insatisfaction, dépérissant progressivement dans leur vie professionnelle.
La semaine dernière, j'ai remarqué un communiqué de presse, envoyé via PressGazette (un site Web d'information britannique). L'article annonçait qu'Acast, la société d'hébergement et de publicité de podcasts de Scandi, dirigerait un consortium d'éditeurs "probablement les plus influents" du podcasting.