2017-06-01 4 views
0

J'ai défini dans mon application Symfony une Relation ManyToMany entre les entités 'Slideshow' et 'Slide'.Symfony/Doctrine: Relation ManyToMany et exception SQL

Entité Slide (extrait):

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
* @ORM\Table(name="slide") 
*/ 
class Slide { 

/* [...] */ 

/** 
* @ORM\ManyToMany(targetEntity="Slideshow", inversedBy="slides", cascade={"persist"}) 
* @ORM\JoinTable(name="slides_to_slideshows", 
*  joinColumns={@ORM\JoinColumn(name="slide_id", referencedColumnName="id")}, 
*  inverseJoinColumns={@ORM\JoinColumn(name="slideshow_id", referencedColumnName="id")} 
*  ) 
*/ 
private $slideshows; 


/** 
* Constructor 
*/ 
public function __construct() 
{ 
    $this->slideArticle = new \Doctrine\Common\Collections\ArrayCollection(); 
    $this->slideshows = new \Doctrine\Common\Collections\ArrayCollection(); 
} 


/* [...] */ 

/** 
* Add slideshow 
* 
* @param Slideshow $slideshow 
* 
* @return Slide 
*/ 
public function addSlideshow(Slideshow $slideshow) 
{ 
    $this->slideshow[] = $slideshow; 

    return $this; 
} 

/** 
* Get slideshows 
* 
* @return \Doctrine\Common\Collections\Collection 
*/ 
public function getSlideshows() 
{ 
    return $this->slideshows; 
} 

/** 
* Remove slideshow 
* 
* @param Slideshow $slideshow 
*/ 
public function removeSlideshow(Slideshow $slideshow) 
{ 
    $this->slideshows->removeElement($slideshow); 
} 
} 

Entité Diaporama (extrait):

/** 
* @ORM\Entity 
* @ORM\Table(name="slideshow") 
*/ 
class Slideshow { 

/* [...] */ 


    /** 
    * @ORM\ManyToMany(targetEntity="Slide", mappedBy="slideshows") 
    */ 
    private $slides;   

    /** 
    * Constructor 
    */ 
    public function __construct() 
    { 
     $this->slides = new \Doctrine\Common\Collections\ArrayCollection(); 
    } 

/* [...] */ 

    /** 
    * Get slides 
    * 
    * @return \Doctrine\Common\Collections\Collection 
    */ 
    public function getSlides() 
    { 
     return $this->slides; 
    } 

    /** 
    * Add slide 
    * 
    * @param \Screensolutions\Macms\FrontBundle\Entity\Slide $slide 
    * 
    * @return Slideshow 
    */ 
    public function addSlide(\Screensolutions\Macms\FrontBundle\Entity\Slide $slide) 
    { 
     $this->slides[] = $slide; 

     return $this; 
    } 

    /** 
    * Remove slide 
    * 
    * @param \Screensolutions\Macms\FrontBundle\Entity\Slide $slide 
    */ 
    public function removeSlide(\Screensolutions\Macms\FrontBundle\Entity\Slide $slide) 
    { 
     $this->slides->removeElement($slide); 
    } 
} 

Quand je fais une requête DB, je reçois ce message d'erreur:

An exception occurred while executing 'SELECT t0.id AS id_1, t0.deleted AS deleted_2, t0.title AS title_3, t0.link AS link_4, t0.rank AS rank_5, t0.artist_id AS artist_id_6 FROM slide t0 WHERE slides_to_slideshows.slideshow_id = ? ORDER BY t0.deleted ASC, t0.rank ASC, t0.title ASC' with params ["2"]:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'slides_to_slideshows.slideshow_id' in 'where clause'

Le t slides_to_slideshows existe, le champ slideshow_id ainsi, donc je suppose que quelque chose ne va pas avec ma définition de la relation. Je me demande pourquoi la requête est slides_to_slideshows.slideshow_id au lieu de FROM slide t0, slides_to_slideshows t1 O WH t1.slideshow_id?

Des indices?

meilleures salutations


EDIT: Ceci est une requête qui provoque l'erreur:

$repository = $this->getDoctrine()->getRepository('FrontBundle:Slide'); 
$slidesAll = $repository->findBy(array('slideshows' => $id), array('deleted' => 'ASC', 'rank' => 'ASC', 'title' => 'ASC')); 

Comme suggéré par CERAD j'ai fait un test avec un simple findAll() requête et que les travaux sans défaut. Le problème est la où la clause 'slideshows' => $ id, donc je suppose qu'il y a quelque chose de mal avec la définition de la relation.

Le cache a été effacé au moins mille fois, la base de données a été mis à jour par doctrine: schéma: mise à jour --force et doctrine: schéma: validate ne signale aucun problème avec ces entités.

Des suggestions? Je suis reconnaissant pour tout soupçon - ce problème me rend fou :(

+0

Est-ce que vous assurez-vous de vider votre cache Qu'est-ce que 'php doctrine bin/console: schéma? : validate' print? – ccKep

+1

Dans Doctrine ORM, vous n'avez jamais plus d'une table dans la clause FROM.Le reste des tables sera lié à l'aide d'instructions JOIN.Avez-vous fait quelque chose d'inhabituel dans votre requête? vous n'avez pas d'anciens fichiers de mapping sous AppBundle/Resources/config/doctrine qui pourraient interférer avec vos annotations – Cerad

+0

Vous devriez poster la requête actuelle qui vous donne l'erreur – ste

Répondre

1

Vous devriez faire quelque chose comme ça

$repository = $this->getDoctrine()->getRepository('FrontBundle:Slide')->createQueryBuilder('s') 
->join('s.slideshows', 'sw') 
->andWhere('sw.id=:id')->setParameter('id', $id) 
->addOrderBy('s.deleted', 'ASC') 
... 
+1

Merci pour votre réponse! Cette requête _queryBuilder_ fonctionne: '$ repository = $ this-> getDoctrine() -> getRepository ('FrontBundle: Slide'); $ slidesAll = $ référentiel-> createQueryBuilder ('s') -> leftJoin ('s.slideshows', 'ss') -> où ('ss.id =: id') -> orderBy ('s .deleted ',' ASC ') -> addOrderBy (' s.rank ',' ASC ') -> addOrderBy (' s.title ',' ASC ') -> setParameter (' id ', $ id) -> getQuery() -> getResult(); ' – Pixelrocker