2017-08-08 67 views
1

我有一個類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; 

我有我的存儲庫中的函數,選擇文件夾,其中用戶是當前用戶或空。
我想對我的子文件夾有相同的規則。我嘗試了這一點,顯然沒有奏效。

$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; 

好了,查詢的工作,但這並不影響我的子文件夾,因爲我仍然可以由其他用戶創建子文件夾。

如果您可以在正確的方向推動我,任何幫助將不勝感激。

+1

在leftJoin方法中,您必須指定實體作爲第一個參數。您正在加入同一張表,因此您必須加入Folder :: class,而不是folder.subFolders。希望有幫助:) – Vladislav

+0

感謝@Vladislav,但實際上這個連接起作用,因爲我已經能夠通過執行SQL來測試它了。 tmas的答案正是我所需要的。謝謝你嘗試! – Pjetr

回答

2

add - > 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());