【发布时间】:2017-08-08 08:26:29
【问题描述】:
我有一个类 Folder 包含这些字段:
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=100)
*/
private $name;
/**
* @var User
*
* @ORM\ManyToOne(targetEntity="UserBundle\Entity\User")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
*/
private $user;
/**
* @var Folder
*
* @ORM\ManyToOne(targetEntity="FileBundle\Entity\Folder", inversedBy="subFolders", cascade={"persist"})
* @ORM\JoinColumn(name="parent_folder_id", referencedColumnName="id")
*
*/
private $parentFolder;
/**
* @var ArrayCollection
*
* @ORM\OneToMany(targetEntity="FileBundle\Entity\Folder", mappedBy="parentFolder")
* @ORM\OrderBy("name")
*/
private $subFolders;
我的存储库中有一个函数可以选择用户为当前用户或 Null 的文件夹。
我想对我的子文件夹有相同的规则。我试过这个,显然没有用。
$qb = $this->createQueryBuilder('folder');
$qb
->leftJoin(
'folder.subFolders',
'folders',
'with',
$qb->expr()->orX(
$qb->expr()->isNull('folders.user'),
$qb->expr()->eq('folders.user', ':user')
)
)
->add('where', $qb->expr()->andX(
$qb->expr()->isNull('folder.parentFolder'),
$qb->expr()->orX(
$qb->expr()->isNull('folder.user'),
$qb->expr()->eq('folder.user', ':user')
)
))
->orderBy('folder.name')
->setParameter('user', $user->getId());
return $qb;
好吧,查询有效,但这不会影响我的子文件夹,因为我仍然得到其他用户创建的子文件夹。
如果您能将我推向正确的方向,我们将不胜感激。
【问题讨论】:
-
在 leftJoin 方法中,您必须将实体指定为第一个参数。您正在加入同一张表,因此您必须加入 Folder::class,而不是 folder.subFolders。希望对您有所帮助:)
-
感谢@Vladislav,但实际上连接有效,因为我已经能够通过执行 SQL 来测试它。 tmas 的答案正是我所需要的。感谢您的尝试!
标签: symfony doctrine-orm doctrine symfony-3.2