[英]Symfony2 recursive query builder
我有一個數據表,其中包含媒體,文檔,PDF和文件夾列表。 與Google雲端硬盤一樣,我想在數據表的頂部顯示痕跡。 數據表反映了通過jQuery點擊任何文件夾時的更改。 除了面包屑外,所有的東西都准備好了。 我有當前打開的文件夾的ID,但我不知道如何從根到當前文件夾獲取層次結構。
目前它給我父ID和名稱而不是整個層次結構。
注意 : - 列之間沒有關系,因為它在同一個表中。
實體字段 : - id, nameDisplay, parentId
實體定義: -
/**
* driveall
* @ORM\Table(name="Driveall")
* @ORM\Entity(repositoryClass="DriveBundle\Repository\DriveallRepository")
*/
class Driveall
{
/**
* @var int
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
* @ORM\Column(name="Name_Display", type="string", length=255)
*/
private $nameDisplay;
/**
* @var int
* @ORM\Column(name="ParentID", type="integer")
*/
private $parentID;
/**
* Get id
* @return int
*/
public function getId()
{
return $this->id;
}
/**
* Set nameDisplay
* @param string $nameDisplay
* @return driveall
*/
public function setNameDisplay($nameDisplay)
{
$this->nameDisplay = $nameDisplay;
return $this;
}
/**
* Get nameDisplay
* @return string
*/
public function getNameDisplay()
{
return $this->nameDisplay;
}
/**
* Set parentID
* @param integer $parentID
* @return Driveall
*/
public function setParentID($parentID)
{
$this->parentID = $parentID;
return $this;
}
/**
* Get parentID
* @return integer
*/
public function getParentID()
{
return $this->parentID;
}
}
查詢構建器: -
$qb = $this->_em->createQueryBuilder();
$qb->select("d.parentID,pid.nameDisplay")
->from($this->_entityName, 'd')
->leftJoin($this->_entityName, 'pid', 'WITH', 'pid.id = d.parentID')
->where("d.status=0")
->andWhere("d.id=" . $id)
->orderBy('d.nameDisplay', 'ASC');
$data = $qb->getQuery()
->getResult();
return $data;
我假設您已使用Doctrine注釋為您的表定義了一個實體類。 例如。
/**
* @ORM\Entity
* @ORM\Table(name="folder")
*/
class Folder
{
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\Column(name="nameDisplay", type="string", length=100)
*/
private $nameDisplay;
/**
* parentID
* @ORM\Column(name="parentID", type="integer", nullable=true)
*/
private $parentId;
}
您可以使用實體管理器的“ createNativeQuery() ”來實現您的目標:
use Doctrine\ORM\Query\ResultSetMapping;
...
$rsm = new ResultSetMapping();
$rsm->addEntityResult(\AppBundle\Entity\Folder::class, 'fd');
$rsm->addFieldResult('fd','id','id');
$rsm->addFieldResult('fd','nameDisplay','nameDisplay');
$query = $this->_em->createNativeQuery(
'SELECT @id :=(SELECT parentID FROM ' . $this->_entityName .' WHERE id = @id) as id,(SELECT nameDisplay FROM ' . $this->_entityName .' WHERE id = @id) as nameDisplay
FROM (SELECT @id := ?) vars
JOIN ' . $this->_entityName .' fd
WHERE @id IS NOT NULL', $rsm);
$query->setParameter(1, 8);
$folderStructure = $query->getResult();
將\\ AppBundle \\ Entity \\ Folder替換為您的實體類,您應該會收到一個數組,其中包含按所需結構排序的實體。 我也無法將parentID映射到結果,但我相信這應該足夠了。
可以在此處找到用作參考的原始查詢
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.