Problème relation (innerJoin) symfony

Fermé
Leon - 10 juil. 2018 à 22:31
 Leon - 16 juil. 2018 à 21:05
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 @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@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_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

2 réponses

ThEBiShOp Messages postés 8378 Date d'inscription jeudi 22 mars 2007 Statut Contributeur Dernière intervention 8 février 2021 1 565
12 juil. 2018 à 14:34
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();
1
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,
0
ThEBiShOp Messages postés 8378 Date d'inscription jeudi 22 mars 2007 Statut Contributeur Dernière intervention 8 février 2021 1 565
16 juil. 2018 à 08:23
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
0
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
0
C'est un peu urgent, si vous pouvez m'aider ça serra SUPER. :)
0