【问题标题】:restricting Doctrine annotated joins限制 Doctrine 注释连接
【发布时间】: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


【解决方案1】:

添加 ->addSelect('folders') 到查询中 如果您不执行 addSelect,则不会在您的实体中初始化关系。因此,如果您稍后执行getSubFolders(),则不会初始化该关系,它只会执行常规选择,而无需您对连接的要求。 使用 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());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多