Użycie EntityRepository :: findBy () w relacjach Many-To-Many doprowadzi do E_NOTICE w Doctrine

W przypadku projektu Symfony2 musiałem stworzyć relację między postem na blogu a tzw. Platformami. Platforma definiuje konkretny filtr oparty na domenie, której używasz do przeglądania witryny. Na przykład: jeśli dołączysz do witryny przez url first-example.com, strona będzie udostępniać tylko posty na blogach, które są połączone z tą konkretną platformą.

W tym celu utworzyłem dwie jednostki Post i Platform. Następnie zmapowałem je razem z relacją Wiele do Wielu. Próbuję pobrać dane za pośrednictwem tej relacji Wiele do wielu z wbudowanej funkcjifindBy() w doktrynach ”EntityRepository.

// 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));

Gdzie$postRepo jest poprawnym repozytorium dlaPost podmiot i$platform istniejącyPlatform obiekt.
Tak czy inaczej: w końcu otrzymuję następujący błąd:

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

Czy w ten sposób możliwe jest nawet pobieranie powiązanych obiektów w relacji Wiele-do-wielu, czy też jestem zmuszony sam napisać te funkcje? Dziwne jest to, że: Doctrine nie wyśle ​​żadnego błędu, takiego jak: „To nie jest możliwe”, ale wewnętrznegoE_NOTICE. Właśnie dlatego twierdzę, że powinno być to możliwe, ale brakuje mi tutaj niektórych punktów.

Pozbawione interesujących części, dwie Jednostki wyglądają tak.

<?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();
    }
}

I oczywiście plik composer.json (a także pozbawiony odpowiednich wierszy)

{
    [...]
    "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",
        [...]

    },
    [...]
}

questionAnswers(3)

yourAnswerToTheQuestion