限制 Doctrine 注释连接
restricting Doctrine annotated joins
我有一个 class 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;
好的,查询有效,但这不会影响我的子文件夹,因为我仍然得到其他用户创建的子文件夹。
如果你能在正确的方向推动我,任何帮助将不胜感激。
添加 ->addSelect('folders') 到查询
如果您不执行 addSelect 关系将不会在您的实体中初始化。因此,如果您稍后执行 getSubFolders()
关系将不会被初始化,它只会执行常规 select 而无需您的连接要求。
使用 addSelect,所有文件夹都将根据您的要求预先加载。
$qb = $this->createQueryBuilder('folder');
$qb
->addSelect('folders')
->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());
我有一个 class 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;
好的,查询有效,但这不会影响我的子文件夹,因为我仍然得到其他用户创建的子文件夹。
如果你能在正确的方向推动我,任何帮助将不胜感激。
添加 ->addSelect('folders') 到查询
如果您不执行 addSelect 关系将不会在您的实体中初始化。因此,如果您稍后执行 getSubFolders()
关系将不会被初始化,它只会执行常规 select 而无需您的连接要求。
使用 addSelect,所有文件夹都将根据您的要求预先加载。
$qb = $this->createQueryBuilder('folder');
$qb
->addSelect('folders')
->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());