Doctrine2 findOneBy Methode null zurückgeben TRAT mit Vererbung mapping

Ich denke, dies ist möglicherweise ein ähnliches Problem zu diese Frage aber ich bin nicht in der Lage, zu kommentieren, noch, und wollte Sie nicht stoßen Sie, indem Sie eine nicht-Antwort-Antwort.

Mache ich ein kommentieren Symfony2-bundle, das es mir erlaubt, direkt zu beziehen, Kommentare zu den verschiedenen entity-Typen, also habe ich eine abstrakte Kommentar "thread" Entität, die dann erweitert um einen konkreten thread Entität pro Objekttyp können Kommentare erhalten.

So zum Beispiel muss es möglich sein, einen Kommentar über die Geschichte Entität, so habe ich einen konkreten StoryThread Entität, erstreckt Thread und gibt eine OneToOne-Attribut, das eine Verknüpfung zu der Geschichte. Die Vorstellung, dass ich dann tun und lassen können $storyThread->findOneBy('story', $story)->getComments();. Allerdings findOneBy immer null zurück. Wenn ich das raw-SQL, die ich abgerufen von debugging hinein und füllen Sie die relevanten story_id, ich bekomme wieder das erwartete Ergebnis.

Hier ist die abstrakte thread Stelle:

use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * @ORM\Entity(repositoryClass="Joe\Bundle\CommentBundle\Repository\ThreadRepository")
 * @ORM\Table(name="comment_threads")
 * @ORM\MappedSuperClass
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="thread_type", type="string")
 * @ORM\DiscriminatorMap( {"story" = "Joe\Bundle\StoryBundle\Entity\StoryThread"} )
 */
abstract class Thread
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="boolean")
     */
    protected $enabled = true;

    /**
     * @var datetime $createdAt
     *
     * @Gedmo\Timestampable(on="create")
     * @ORM\Column(name="created_at", type="datetime")
     */
    protected $createdAt;

    /**
     * @ORM\OneToMany(targetEntity="Comment", mappedBy="thread_id", cascade={"persist"})
     * @param ArrayCollection $data
     */
    protected $comments;


    function __construct()
    {
        $this->comments = new ArrayCollection();
    }

und hier ist die konkrete StoryThread Person:

use Doctrine\ORM\Mapping as ORM;
use Joe\Bundle\CommentBundle\Entity\Thread as AbstractThread;

/**
 * @ORM\Entity(repositoryClass="Joe\Bundle\StoryBundle\Repository\StoryThreadRepository")
 * @ORM\Table(name="story_comment_threads")
 */
class StoryThread extends AbstractThread
{
    /**
     * @ORM\OneToOne(targetEntity="Story")
     * @ORM\JoinColumn(name="story_id", referencedColumnName="id")
     */
    protected $story;

    /**
     * @var datetime $createdAt
     */
    protected $createdAt;


    public function __construct()
    {
        $this->comments = new \Doctrine\Common\Collections\ArrayCollection();
    }

Und schließlich ist hier, wie ich versuche zum abrufen der StoryThread Objekt aus einer bestimmten Geschichte entity: (getThreadEntityName erhält den vollständig qualifizierten StoryThread Klasse name, und getObjectColumn gibt den Namen der Spalte, die verwendet wird zum zuordnen einer ObjectThread Person, um die es Objekt, also in diesem Fall "Geschichte")

/**
 * @param CommentableInterface $object
 * @return AbstractThread
 */
public function findThreadByObject(CommentableInterface $object)
{
    /** @var $repository ThreadRepository */
    $repository = $this->em->getRepository($object->getThreadEntityName());

    $thread = $repository->findOneBy(array(
        $repository->getObjectColumn() => $object
    ));

    if (!$thread) {
        $thread = $this->createThread($object);
    }

    return $thread;
}

Hier ist der SQL-Code generiert wird, innerhalb der findOneBy Methode: (wenn ich ersetzen ? mit einem aktuellen story-id, wie 1, zurück bekomme ich ein Ergebnis wie ich es erwarten würde)

SELECT
t1.id AS id2,
t1.enabled AS enabled3,
t1.created_at AS created_at4,
t0.story_id AS story_id5,
t1.thread_type
FROM
story_comment_threads t0
INNER JOIN comment_threads t1 ON t0.id = t1.id
WHERE
t0.story_id = ?

Könnte mir jemand sagen, wie ich entweder die findOneBy Methode zu arbeiten, oder vielleicht eine alternative, die funktionieren würde? Dank

haben Sie versucht, $storyThread->findOneBystory($story)->getComments(); ??
Sorry für die Verspätung, ich habe nicht die chance bekommen, um zu versuchen, bis jetzt. Dies produziert das gleiche Ergebnis. Aber mein Tag der Weisheit, da dieses posting gestern führte mich zu versuchen, mit $object->getId() als Wert, und das scheint getan haben, der trick! 🙂

InformationsquelleAutor RobMasters | 2012-05-14

Schreibe einen Kommentar