为什么doctrine总是将null返回到带条件的左连接?

时间:2014-10-24 18:24:32

标签: php symfony doctrine-orm doctrine

我在事件和用户实体(User.eventNotified)之间有多对多的双向关联。

我正在寻找一个函数,根据给定用户的id来调出此关联事件。

所以我的功能看起来像这样:

public function getEventNotifiedById( $user, $eventId )
{
    //We only want to return users nearby who are available OR who
    $qb = $this->getEntityManager()->createQueryBuilder();

    $qb->select( 'USER', 'EVENT' )
        ->from( 'Entity\User',  'USER' )
        ->where(
            $qb->expr()->eq( 'USER', ':user' )
        )
        ->leftJoin( 'USER.eventNotified', 'EVENT', 'WITH', 'EVENT.id = :eventId'  ); //CA NE MARCHE PAS chai pas pq

    $array = array(
         'user'     => $user,
         'eventId'  => $eventId
    );

    $qb->setParameters( $array );

    $user = $qb->getQuery()->getOneOrNullResult();

    if ( $user )
    {
        return $user->getEventNotified();
    }
    else
    {
        return false;
    }
}

但$ user-> getEventNotified()始终返回null。为什么?

我想我在左边的连接中做错了但我无法找到。非常感谢

编辑:

这是我的2个实体的必要部分:

USER ENTITY:

<?php

namespace Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\EntityRepository;

require_once 'Repositories/UserRepository.php';

/**
 * User
 *
 * @ORM\Table(name="user")
 * @ORM\Entity(repositoryClass="Repositories\UserRepository")
 */
class User
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer", nullable=false, unique=true)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

[...]


    /**
     * Bidirectional - Many users have notified they want to go to different events (OWNING SIDE)
     *
     * @var \Doctrine\Common\Collections\Collection
     *
     * @ORM\ManyToMany(targetEntity="Entity\Event", inversedBy="userNotified", cascade={"persist"})
     */
    private $eventNotified;
[...]
}

EVENT ENTITY

<?php

namespace Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\EntityRepository;

require_once 'Repositories/EventRepository.php';

/**
 * User
 *
 * @ORM\Table(name="event")
 * @ORM\Entity(repositoryClass="Repositories\EventRepository")
 */
class Event
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer", nullable=false, unique=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;
[...]


    /**
     * Bidirectional - Many users are intending many events (INVERSE SIDE)
     *
     * @ORM\ManyToMany(targetEntity="User", mappedBy="eventNotified", cascade={"remove"})
     */
    private $userNotified;
[...]
}

老实说,我在我的回购中经常使用这种关联,一切正常。我试过var转储我的用户并看到他的事件通知没有&#34;用&#34;左连接中的子句,我可以在那里看到我的事件。

非常感谢你的帮助

2 个答案:

答案 0 :(得分:2)

[增订]

首先,你应该摆脱require_once并使用Doctrine \ ORM \ EntityRepository;您在注释中设置了存储库类,并且不应该使用实体中的任何存储库。另外,为什么在你的Event类中使用,unique = false并带有id?

你也需要
@ORM\JoinTable(name="user_event")

for manyToMany

所以ASSUMING你实际上是在构造函数中将eventNotified设置为ArrayCollection,并且还有你的getter和setter,我相信你确实这样做了。我会说检查你的二传手并确保你正在设置

$this->eventNotified[] = $eventNotified;
return $this;

而在你的吸气器中,你实际上正在回归

$this->eventNotified;

如果这一切都很好并且我理解这一点,那么无论如何你的查询似乎都是错误的。你的联系需要在那之前。

$event = $qb->select( 'event' )
    ->from( 'Entity\event',  'event' )
    ->leftJoin( 'event.userNotified', 'user', 'WITH', 'user.id = :userId'  );
    ->where('event.id = :eventId')
    ->setParameters(['userId' => $user->getId(), 'eventId' => $eventId])
    ->getQuery()
    ->getOneOrNullResult();

 return $event ? $event : false;

答案 1 :(得分:0)

您的多对多关系定义不正确,您必须指定要在所属网站上存储关系的其他交叉表。看看Doctrine documentation

class User
{
    // ...

    /**
     * Bidirectional - Many users have notified they want to go to different events (OWNING SIDE)
     *
     * @var \Doctrine\Common\Collections\Collection
     *
     * @ORM\ManyToMany(targetEntity="Entity\Event", inversedBy="userNotified", cascade={"persist"})
     * @ORM\JoinTable(name="user_event")
     */
    private $eventNotified;

    // ...
}