2017-09-12 1 views
7

Ich habe eine Datentabelle, die Medien, Dokumente, PDFs und Ordner-Liste enthält. Wie bei Google Drive, möchte ich den Breadcrumb oben in der Datentabelle anzeigen. Die Datentabelle spiegelt die Änderungen wider, wenn Sie über jQuery auf einen beliebigen Ordner klicken. Alle Dinge sind bereit, außer der Brotkrume. Ich habe die ID des aktuellen geöffneten Ordners, aber ich weiß nicht, wie ich die Hierarchie vom Stamm zum aktuellen Ordner bekomme.Symfony2 rekursive Abfrage-Generator

Momentan gibt es mir die Eltern-ID und den Namen nicht die gesamte Hierarchie.

Hinweis: - Es gibt keine Beziehung zwischen den Spalten wie in der gleichen Tabelle.
Entity Felder: - id, nameDisplay, parentId

Definition Entity: -

/** 
* 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; 
    } 
} 

Query-Builder: -

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

Veröffentlichen Sie Ihre Ordner Entitätsdefinition –

+0

@MKhalidJunaid Entity-Definition hinzugefügt finden –

Antwort

4

Ich nehme an, Sie haben eine Objektklasse für Ihre Tabelle definiert Doctrine-Anmerkungen verwenden. z.B.

/** 
* @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; 
} 

können Sie "createNativeQuery()" Ihres Unternehmens-Manager zu erreichen, was Sie wollen:

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

ersetzen \ AppBundle \ Entity \ Folder mit Ihrer Entity-Klasse und Sie sollten Empfangen Sie ein Array mit Entitäten, die zu der gewünschten Struktur geordnet sind. Ich konnte auch nicht die ParentID zum Ergebnis zuordnen, aber ich denke, das sollte reichen.

Original-Abfrage, die als Referenz verwendet wurde, kann here