我在事件和用户实体(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;左连接中的子句,我可以在那里看到我的事件。
非常感谢你的帮助
答案 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;
// ...
}