Symfony2 рекурсивный построитель запросов

У меня есть таблица данных, которая содержит медиа, документы, PDF и список папок. Так же, как Google Drive, я хочу показать хлебные крошки в верхней части таблицы данных. Таблица данных отражает изменения при кликах по любым папкам через jQuery. Все готово, кроме крошки. У меня есть идентификатор текущей открытой папки, но я не знаю, как получить иерархию от корня к текущей папке.

В настоящее время он дает мне родительский идентификатор и имя, а не всю иерархию.

Заметка : — Нет связи между столбцами, как это было в той же таблице.
Поля сущностей : — 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;

9

Решение

Я предполагаю, что вы определили класс сущности для своей таблицы, используя аннотации 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 с результатом, но я считаю, что этого должно быть достаточно.

Исходный запрос, который использовался в качестве ссылки, можно найти Вот

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]