Problème relation (innerJoin) symfony

Problème relation (innerJoin) symfony Unknown relation alias: symfony (Résolu) » Forum - Programmation Relation bidirectionelle Symfony (Résolu) » Forum - PHP Symfony 2 : relation entre controleur et vue » Forum - Webmaster Valeur relative (Résolu) » Forum - Webmaster La relation d'approbation entre cette station de travail et le domaine principal a échoué » Forum - Logiciels

Bonjour,

Je dois faire une relation en Symfony dans une repository, mais malheureusement ça ne marche pas, et je n'arrive pas à résoudre ce problème.

Voici mes codes : (code exemple)

Est ce que vous pouvez m'aider ?

Merci

Entity -> Table1.php

<?php  namespace TEST\ServiceBundle\Entity;  use Doctrine\ORM\Mapping as ORM;  /**  * Table1  *  * @ORM\Table(name="table1")  * @ORM\Entity(repositoryClass="TEST\ServiceBundle\Repository\Table1Repository")  */ class Table1 {     /**      * @var int      *      * @ORM\Column(name="id_tab1", type="integer")      * @ORM\Id      * @ORM\GeneratedValue(strategy="AUTO")      */     private $id;      /**      * @var int      *      * @ORM\Column(name="table2_id", type="integer")      * @ORM\OneToMany(targetEntity="ServiceBundle\Entity\Table2", mappedBy="table1Id")      */     private $table2Id;      /**      * @var string      *      * @ORM\Column(name="val_tab1", type="string", length=255)      */     private $valTab1;       /**      * Get id      *      * @return int      */     public function getId()     {         return $this->id;     }      /**      * Set valTab1      *      * @param string $valTab1      *      * @return Table1      */     public function setValTab1($valTab1)     {         $this->valTab1 = $valTab1;          return $this;     }      /**      * Get valTab1      *      * @return string      */     public function getValTab1()     {         return $this->valTab1;     } }


Entity-> Table2.php

 <?php  namespace TEST\ServiceBundle\Entity;  use Doctrine\ORM\Mapping as ORM;  /**  * Table2  *  * @ORM\Table(name="table2")  * @ORM\Entity(repositoryClass="TEST\ServiceBundle\Repository\Table2Repository")  */ class Table2 {     /**      * @var int      *      * @ORM\Column(name="id_tab2", type="integer")      * @ORM\Id      * @ORM\GeneratedValue(strategy="AUTO")      */     private $id;      /**      * @var string      *      * @ORM\Column(name="val_tab2", type="string", length=255)      */     private $valTab2;      /**      * @var int      *      * @ORM\Column(name="table1_id", type="integer")      * @ORM\ManyToOne(targetEntity="ServiceBundle\Entity\Table1", inversedBy="table2Id")      */     private $table1Id;       /**      * Get id      *      * @return int      */     public function getId()     {         return $this->id;     }      /**      * Set valTab2      *      * @param string $valTab2      *      * @return Table2      */     public function setValTab2($valTab2)     {         $this->valTab2 = $valTab2;          return $this;     }      /**      * Get valTab2      *      * @return string      */     public function getValTab2()     {         return $this->valTab2;     }      /**      * Set table1Id      *      * @param integer $table1Id      *      * @return Table2      */     public function setTable1Id($table1Id)     {         $this->table1Id = $table1Id;          return $this;     }      /**      * Get table1Id      *      * @return int      */     public function getTable1Id()     {         return $this->table1Id;     } }   



Repository-> Table1Repository.php

 <?php  namespace TEST\ServiceBundle\Repository;  /**  * Table1Repository  *  * This class was generated by the Doctrine ORM. Add your own custom  * repository methods below.  */ class Table1Repository extends \Doctrine\ORM\EntityRepository { 	public function test(){ 		$qb = $this->_em->createQueryBuilder();         $qb->select('t2')         	->from('ServiceBundle:Table2', 't2')         	->innerJoin('t2.table1_id', 't1')         ;          	//dump($qb->getQuery());           return $qb->getQuery()->getResult(); 	} }  


Code SQL
 -- phpMyAdmin SQL Dump -- version 4.7.4 -- https://www.phpmyadmin.net/ -- -- Hôte : 127.0.0.1:3306 -- Généré le :  mar. 10 juil. 2018 à 20:28 -- Version du serveur :  5.7.19 -- Version de PHP :  7.1.9  SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; SET AUTOCOMMIT = 0; START TRANSACTION; SET time_zone = "+00:00";   /*!40101 SET @[email protected]@CHARACTER_SET_CLIENT */; /*!40101 SET @[email protected]@CHARACTER_SET_RESULTS */; /*!40101 SET @[email protected]@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8mb4 */;  -- -- Base de données :  `inner` --  -- --------------------------------------------------------  -- -- Structure de la table `table1` --  DROP TABLE IF EXISTS `table1`; CREATE TABLE IF NOT EXISTS `table1` (   `id_tab1` int(11) NOT NULL AUTO_INCREMENT,   `val_tab1` varchar(255) NOT NULL,   PRIMARY KEY (`id_tab1`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;  -- -- Déchargement des données de la table `table1` --  INSERT INTO `table1` (`id_tab1`, `val_tab1`) VALUES (1, 'test1'), (2, 'test1(2)');  -- --------------------------------------------------------  -- -- Structure de la table `table2` --  DROP TABLE IF EXISTS `table2`; CREATE TABLE IF NOT EXISTS `table2` (   `id_tab2` int(11) NOT NULL AUTO_INCREMENT,   `val_tab2` varchar(255) NOT NULL,   `table1_id` int(11) NOT NULL,   PRIMARY KEY (`id_tab2`),   KEY `fkey` (`table1_id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;  -- -- Déchargement des données de la table `table2` --  INSERT INTO `table2` (`id_tab2`, `val_tab2`, `table1_id`) VALUES (1, 'val 2', 1), (2, 'val 2(2)', 2);  -- -- Contraintes pour les tables déchargées --  -- -- Contraintes pour la table `table2` -- ALTER TABLE `table2`   ADD CONSTRAINT `fkey` FOREIGN KEY (`table1_id`) REFERENCES `table1` (`id_tab1`); COMMIT;  /*!40101 SET CHARACTER_SET_[email protected]_CHARACTER_SET_CLIENT */; /*!40101 SET [email protected]_CHARACTER_SET_RESULTS */; /*!40101 SET [email protected]_COLLATION_CONNECTION */;  

Forum

Problème relation (innerJoin) symfony Unknown relation alias: symfony (Résolu) » Forum - Programmation Relation bidirectionelle Symfony (Résolu) » Forum - PHP Symfony 2 : relation entre controleur et vue » Forum - Webmaster Valeur relative (Résolu) » Forum - Webmaster La relation d'approbation entre cette station de travail et le domaine principal a échoué » Forum - Logiciels

Web: www.shapebootstrap.net

5 réponses

Marsh

NOVEMBER 9, 2013 AT 9:15 PM

Salut,

Tu utilises quelle version de Symfony et de Doctrine ?
Tu as un message d'erreur ? Si oui, lequel ?

Pour commencer il y a une chose qui saute aux yeux, c'est que tu n'as pas compris la logique de Doctrine. Son but est de s'éloigner d'un logique base de donnée et de permettre de manipuler non pas des tables, comme en SQL, mais des objets.
Il en résulte que ton entité n'est pas une table, mais un type d'objet, comme par exemple Table, qui pourra avoir une relation avec une autre entité Matiere, et dans mon entité Table, la relation sera portée par une propriété qui s'appellera $matiere, et non pas $matiereId.
Tu dois vraiment oublier ce qui se passe derrière, pense juste que tu manipules des objets.

Malgré tout si ton entité est correctement déclarée, tu pourras l'interroger.
D'ailleurs pour requête aussi simple, tu n'as pas besoin d'écrire de requête dans ton repository, tu peux accéder directement aux éléments Table2 liés à Table1, pour cela tu dois ajouter au moins un getter dans Table1 :

     public function getTable2()     {         return $this->table2;     }


Ce getter devra te retourner une collection de Table2... C'est pour ça qu'on utilise le pluriel pour le repérer plus facilement dans le cas d'un OneToMany
Tu auras besoin par la suite d'un setter...

De cette façon tu peux récupérer tes Table2 liés à Table1

$table2 = $table1->getTable2();

Merci ThEBiShOp 1

Avec quelques mots c'est encore mieux Ajouter un commentaire

CCM a aidé 22504 internautes ce mois-ci

Reply
réponses:
  • auteur

    Bonjour,
    Merci pour votre réponse et désoler pour mon réponse tardive, en fait, je sais bien qu'il faut jamais toucher BDD directement, mais, le projet que je travaille, je suis obligé de faire comme ça.

    Le projet est complexe, je vous ai données juste une exemple (qui ne fonctionne pas malheureusement).

    Voici l'erreur que je reçois "[Semantical Error] line 0, col 72 near 't1': Error: Class TEST\ServiceBundle\Entity\Table2 has no association named table1_id"

    Cordialement,

  • ThEBiShOp

    Comme je disais, doctrine est une classe d'abstraction de base de donnée, la relation s'appelle $table1Id, dans ta requête, tu dois donc faire appelle à t2.table1Id

  • auteur

    Bonjour, merci pour votre réponse,
    Malheureusement ça marche pas encore.

    Je reçois la même erreur.

    [Semantical Error] line 0, col 71 near 't1': Error: Class TEST\ServiceBundle\Entity\Table2 has no association named table1Id

    $qb = $this->_em->createQueryBuilder();          		$qb->select('t2.val_tab2')         	->from('ServiceBundle:Table2', 't2')         	->innerJoin('t2.table1Id', 't1')         ;           return $qb->getQuery()->getResult();


    Je pense que ça peux venir @ORM\ManyToOne(targetEntity="ServiceBundle\Entity\Table1", inversedBy="table2Id")
    ou il y a un problème par rapport foreign key

Marsh

NOVEMBER 9, 2013 AT 9:15 PM

C'est un peu urgent, si vous pouvez m'aider ça serra SUPER. :)

Reply

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed