0
votes

Récupérer des objets de la base de données ne fonctionne pas dans Symfony 4

J'ai un problème lorsque j'utilise la méthode Trouver () en symfony:

PODEEXCEPTION: SQLSTATE [42S22]: Colonne non trouvée: 1054 Colonne inconnue 'T10.Id' in 'on Clause' P> blockQuote>

Ce n'est qu'avec une entité spécifique, avec les autres que cela fonctionne parfaitement. p>

ici mon code: p>

 <?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\ClasseRepository")
 */
class Classe
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $name;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Formation", inversedBy="classe")
     */
    private $formation;

    /**
     * @ORM\OneToOne(targetEntity="App\Entity\Calendar", mappedBy="classe", cascade={"persist", "remove"})
     */
    private $calendar;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\person", inversedBy="classes")
     */
    private $responsable;

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

    public function getName(): ?string
    {
        return $this->name;
    }

    public function setName(string $name): self
    {
        $this->name = $name;

        return $this;
    }

    public function getFormation(): ?Formation
    {
        return $this->formation;
    }

    public function setFormation(?Formation $formation): self
    {
        $this->formation = $formation;

        return $this;
    }

    public function __toString() {
        return $this->name;
    }

    public function getCalendar(): ?Calendar
    {
        return $this->calendar;
    }

    public function setCalendar(?Calendar $calendar): self
    {
        $this->calendar = $calendar;

        // set (or unset) the owning side of the relation if necessary
        $newClasse = $calendar === null ? null : $this;
        if ($newClasse !== $calendar->getClasse()) {
            $calendar->setClasse($newClasse);
        }

        return $this;
    }

    public function getResponsable(): ?person
    {
        return $this->responsable;
    }

    public function setResponsable(?person $responsable): self
    {
        $this->responsable = $responsable;

        return $this;
    }
}


17 commentaires

Votre base de données est-elle à jour / est la table créée?


@Jeen oui bien sûr


Pouvez-vous exécuter PHP Bin / Console Doctrine: Schéma: Valider? Comme l'erreur affiche dans la clause ON, il pourrait y avoir quelque chose de mal avec les relations.


N'est pas getManager () manquant après getdoctrine () ? Dans Symfony 4, vous ne le faites plus si ...


Ok j'ai reçu un message d'erreur lorsque j'exécute PHP Bin / Console Doctrine: Schéma: Valider. Maintenant, c'est ok la commande me dit: [OK] Le schéma de base de données est synchronisé avec les fichiers de mappage. Mais j'ai toujours la même erreur lorsque j'utilise la méthode Trouver () pour chercher des objets.


@Preciel dans la documentation: symfony.com/doc/ actuel / ... . Ils n'utilisent pas GetManager (). Et la même méthode fonctionne avec mon autre entité.


Étant donné que le message d'erreur indique qu'il ne sait pas t10.id il suggère que l'erreur se produit sur certains profond jointes. (QueryBuilder incrémente généralement les numéros d'alias qu'il donne les tables de la requête, à partir de T0, ...). Il est très probable que T10 n'est pas la table / entité de la Classe.


Alors pouvez-vous fournir un peu plus de votre contrôleur s'il vous plaît? Je ne pense pas que votre erreur est l'endroit où vous pensez que c'est. C'est très probablement sur un rejoindre .


$ calendar = nouveau calendrier (); $ calendrier-> SetStartDate ($ _ POST ['START']); $ calendrier-> setenddate ($ _ post ['fin']); $ calendrier-> Seventent ($ _ post ["Evénement"]); $ classeid = $ _post ['Classeid']; $ repo = ceci-> getdoctrine () -> getRepository (Classe :: Classe); $ classe = $ repo-> trouver ($ classeid); $ calendrier-> SetClasse ($ Classe); @preciel


Modifiez votre question au lieu d'utiliser Commentaire pour compléter votre code @mohasalim


@Preciel c'est fait


Pouvez-vous également ajouter une capture d'écran de l'erreur lancée PLZ? (essayer d'isoler la ligne où l'erreur se produit)


@Preciel imgur.com/a/i248hje


Je voulais dire l'erreur lancée par symfony (cette page pleine de rouge)


@Preciel imgur.com/a/g09LVWL


Une longue capture d'écran pour voir ce qui est sous l'exception Log Plz (écrire un guichet automatique de Replay, beaucoup de choses ne sont pas juste dans votre code)


@Preciel imgur.com/A/G09LVWL J'ai mis à jour avec tous les écrans.


5 Réponses :


1
votes

essayez de trouver avec Espace de noms :

$ classeid = $ _post ['classeid'] ?? 1;

ou

$ classeid = $ demande-> demande-> obtenir ('classeid', 1) ; // par défaut votre identifiant = 1

$ ceci-> getdoctrine () -> gettrepository (app \ entité \ classe :: classe) -> trouver ($ classeid);

et avez-vous à jour votre :

DOCTRINE: SCHEMA: MISE À JOUR

Après cela, essayez à nouveau.


0 commentaires

1
votes

Tout d'abord, vous n'aviez pas d'utiliser directement $ directement, mais vous devez utiliser la demande comme celle-là. XXX

Peut-être que votre identifiant insanitué est le problème. < p> Vous pouvez essayer d'écrire une méthode avec le repo de la classe en tant que paramètre formel. xxx

Je voudrais vous suggérer, forcer le "classid" avec un codé en dur. xxx

ou xxx


0 commentaires

0
votes

S'il vous plaît essayer d'écrire une fonction de référentiel. Juste pour comprendre le problème.

public function getThisDamnClassFromId(int $Id): array {
$conn = $this->getEntityManager()->getConnection();

$sql = '
    SELECT * FROM classe c
    WHERE c.id > :val';
$stmt = $conn->prepare($sql);
$stmt->execute(['id' => $id]);


return $stmt->fetchAll();
}


10 commentaires

J'ai déjà essayé avant le SQL et j'ai eu mes données, mais le problème est que j'ai besoin d'obtenir l'objet et non les données.


C'était juste pour être sûr que vous recherchiez des données valides. Avez-vous changé le $ _Post avec demande comme je l'ai écrit? Avez-vous copié le référentiel d'un autre? Essayez d'utiliser faire: référentiel et régénérez-le (vous devez le supprimer avant)


oui j'ai commuté le $ _Post. J'ai supprimé le fichier Classerepository, puis j'ai utilisé PHP Bin \ Console Make: entité --regene. Mais j'ai toujours l'erreur. @ Sniperershady


Pourriez-vous publier votre classe (veuillez ne rien changer), votre classe de référentiel et votre contrôleur? (pas seulement le cas d'utilisation)


La classe: Pastebin.com/r7hrepyd , le référentiel: pastebin.com/mp118dqt , le contrôleur: Pastebin.com/q29Unygd


@mohasalim pouvez-vous inclure l'annotation ORM du champ ID des entités associées (formation, calendrier, personne)


@Jeen Formation: / ** * @orm \ onetomanany (Tarnexity = "app \ entity \ classe", mappéby = "formation") * / Classe privée $;


Calendrier: / ** * @orm \ onetoone (credentity = "app \ entité \ classe", inversedby = "calendrier", cascade = {"persist", "Supprimer"}) * / Classe privée $;


Personne: / ** * @orm \ onetomanany (Tarnexity = "App \ Entity \ Classe", mappéby = "Responsable") * / Classes $ privées;


@mohasalim je voulais dire les champs d'identité de ces entités, mettez également à jour votre question avec le code, ce n'est pas lisible.



1
votes

La façon dont vous travaillez avec Symfony 4 est fausse.
Utilisation directe $ _ POST code>, $ _ serveur code>, etc n'est pas recommandé.

Voici comment votre fonction newcalendar code> doit être: p>

php bin/console make:migration
php bin/console doctrine:migrations:migrate


11 commentaires

Merci pour l'examen du code, le classeid est une valeur valide.


Ensuite maintenant, pouvez-vous quitter (); votre fonction, ligne par ligne, jusqu'à ce que vous obteniez l'erreur, il s'agira d'identifier la ligne provoquant l'erreur.


L'erreur vient dans cette ligne: $ classe = $ classerepository-> trouver ($ demande-> demande-> obtenir ('CLA Sseid')); @Peciel


J'ai déjà essayé cette commande, cela me dit [Avertissement] Aucun changement de base de données n'a été détecté.


Alors que votre problème ... Avez-vous défini votre base de données dans .env fichier?


Oui, la base de données dans .env est déjà définie. La méthode de recherche () fonctionne avec une autre entité comme le travail, donc je ne pense pas que c'est parce que la base de données n'est pas correctement définie.


Ah, mon mauvais, missionnez le message d'erreur ... avant la ligne qui provoque l'erreur, si vous faites ce Dump ($ classereposer); Quitter (); . As-tu quelque chose? Ou le varait est null?


Ensuite, bon ... ce qui signifie que le problème est vraiment autour de cette demande ... pourrait-il être que cela ne peut pas récupérer calendrier qui est une oneoone? Y a-t-il une valeur dans le calendrier?


Oui Calendrier contient de la valeur mais je ne pense pas que c'est à cause du calendrier.


Je ne pense pas que ce soit le cas mais, par chacette, la requête apparaît dans l'onglet Doctrine du profileur?


Ouais, cette requête est fausse ... t10 n'a pas été aliasé. Donc, ça correspond à rien. Il shoult soit t0.id . La question est ... Comment pouvons-nous nous retrouver avec cette requête ... Je soupçonne qu'une relation est fausse, mais ne peut pas comprendre de quelle manière c'est ...: /



0
votes

L'erreur provient de mauvaises associations avec l'entité. J'ai donc supprimé l'entité et toutes les associations et regroupez la classe et maintenant son travail.


0 commentaires