Für ein Symfony2-Projekt musste ich eine Beziehung zwischen einem Blogpost und so genannten Plattformen erstellen. Eine Plattform definiert einen bestimmten Filter basierend auf der Domäne, die Sie zum Anzeigen der Site verwenden. Zum Beispiel: Wenn Sie die Website per URL first-example.com betreten, wird die Website nur Blog-Posts bereitstellen, die mit dieser spezifischen Plattform verbunden sind.Die Verwendung von EntityRepository :: findBy() mit Many-To-Many-Beziehungen führt zu einer E_NOTICE in Doctrine
Um dies zu tun, habe ich zwei Entitäten Post und Plattform erstellt. Danach habe ich sie zusammen mit einer Many-To-Many-Beziehung abgebildet. Ich versuche, Daten über diese Viele-zu-Viele-Beziehung von der eingebauten Funktion findBy()
in Doctrines 'EntityRepository
abrufen.
// every one of these methods will throw the same error
$posts = $postRepo->findBy(array('platforms' => array($platform)));
$posts = $postRepo->findByPlatforms($platform);
$posts = $postRepo->findByPlatforms(array($platform));
Wo $postRepo
das richtige Repository für die Post
Einheit ist und $platform
ein bestehendes Platform
Objekt.
So oder so: ich folgende Fehlermeldung am Ende immer:
ErrorException: Notice: Undefined index: joinColumns in [...]/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php line 1495
[...]/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php:1495
[...]/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php:1452
[...]/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php:1525
[...]/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php:1018
[...]/vendor/doctrine/orm/lib/Doctrine/ORM/Persisters/BasicEntityPersister.php:842
[...]/vendor/doctrine/orm/lib/Doctrine/ORM/EntityRepository.php:157
[...]/src/Foobar/BlogBundle/Tests/ORM/PostTest.php:102
Ist es sogar möglich, im Zusammenhang entites in einer Viele-zu-Viele-Beziehung abzurufen diese Weise oder bin ich von mir, diese Funktionen zu schreiben gezwungen? Das komische Ding ist: Doctrine wirft keinen Fehler wie: "Es ist nicht möglich.", Aber eine interne E_NOTICE
. Deshalb denke ich, dass es möglich sein sollte, aber ich verpasse hier einige Punkte.
Abgerissen auf die interessanten Teile sehen die beiden Entitäten so aus.
<?php
namespace Foobar\CommunityBundle\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
// [...] other namespace stuff
/**
* @ORM\Entity(repositoryClass="Foobar\CommunityBundle\Entity\Repository\PlatformRepository")
* @ORM\Table(name="platforms")
*/
class Platform
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
// [...] other field stuff
}
<?php
namespace Foobar\BlogBundle\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
// [...] other namespace stuff
/**
* @ORM\Entity(repositoryClass="Foobar\BlogBundle\Entity\Repository\PostRepository")
* @ORM\Table(name="posts")
*/
class Post implements Likeable, Commentable, Taggable, PlatformAware
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\ManyToMany(targetEntity="Foobar\CommunityBundle\Entity\Platform", cascade={"persist"})
* @ORM\JoinTable(name="map_post_platform",
* joinColumns={@ORM\JoinColumn(name="post_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="platform_id", referencedColumnName="id")}
* )
*/
protected $platforms;
// [...] other fields
/**
* Constructor
*/
public function __construct()
{
// [...]
$this->platforms = new ArrayCollection();
}
}
Und natürlich die composer.json Datei (wie auch auf die entsprechenden Linien abgespeckte)
{
[...]
"require": {
"php": ">=5.3.3",
"symfony/symfony": "2.1.*",
"doctrine/orm": ">=2.2.3,<2.4-dev",
"doctrine/doctrine-bundle": "1.0.*",
"doctrine/doctrine-fixtures-bundle": "dev-master",
[...]
},
[...]
}
. Nur ein kleiner Zusatz. Ihre erste Methode schreibt eine eigene Funktion in einem benutzerdefinierten Repository. Ich habe mich vielleicht unklar ausgedrückt, aber ich habe versucht, die verwandten Entitäten durch die eingebaute 'find *()' Funktion von Doctrine zu holen. Die zweite Methode funktioniert nicht, da ich eine unidirektionale Verknüpfung habe. Daher gibt es auf 'Platform' keine Eigenschaft' $ posts' und daher auch keine Getter und Setter. Nichtsdestotrotz hilft mir Ihre Antwort sehr, da ich jetzt sicherer bin, dass es nicht möglich ist, die eingebauten Wege zu nutzen, um gefilterte Viele-zu-Viele-Assoziationen zu erhalten. – devsheeep