Php 为什么条令总是将null返回给带条件的左连接?
我在事件和用户实体(User.eventNotified)之间有一个多对多的双向关联 我正在寻找一个函数,该函数根据给定用户的id显示此关联的事件 我的函数如下所示:Php 为什么条令总是将null返回给带条件的左连接?,php,symfony,doctrine-orm,doctrine,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()-&g
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个实体的必要部分:
用户实体:
<?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;
[...]
}
[更新]
首先,你应该去掉require_once和use原则\ORM\EntityRepository;您正在注释中设置repository类,不应该使用实体中的任何存储库。还有,为什么在事件类中使用unique=false和id?你还需要
@ORM\JoinTable(name="user_event")
对许多人来说
因此,假设您实际上正在将eventNotified设置为构造函数中的ArrayCollection,并且还有getter和setter,我很确定您会这样做。我想说的是,检查你的设定器,确保你正在设定
$this->eventNotified[] = $eventNotified;
return $this;
在你的getter中,你真的回来了
$this->eventNotified;
如果这一切都是好的,并且我理解这一点是正确的,那么不管怎样,您的查询似乎是错误的。您的加入必须在where之前
$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;
您的多对多关系定义不正确,您必须指定要在所属站点上的哪个附加交叉表中存储这些关系。看一看这张照片
谢谢你的帮助,我已经编辑了我的问题,以便为你提供更多信息,如果你想进一步了解。谢谢你的回答,让我试试:)谢谢你的回答。如果我错了,请纠正我,但join Tabl字段不是必需的,并且默认情况下由doctrine2设置为user_event。
$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;
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;
// ...
}