1

序章

ツリー構造を管理するために、Symfony v3.1.6、Doctrine v2.5.4、および StofDoctrineExtensionsBundle [1] を使用しています。

ツリー構造をセットアップするには、Symfony.com [2] のドキュメントを使用し、続いて GitHub [3] のドキュメントを使用しました。次に、ツリーのセットアップに進みました。例 [4] のツリー エンティティを使用し、[5] のコードを使用してツリーを作成しました。

コード

機能CategoryRepository

public function getParentId($child_node_id)
{
    // get parent_id of a tree element
    $em = $this->getEntityManager();
    $query = $em->createQueryBuilder()
        ->select('c')
        ->from('AppBundle:Category', 'c')
        ->where('c.id = :nodeId')
        ->setParameter('nodeId', $child_node_id)
        ->setMaxResults(1)
        ->getQuery();

    $parent = $query->getResult();
    $parent_null = $parent[0]->getParent();

    // if parent element is null - efectively element is root of the tree
    if ($parent_null === null)
    {
        $parent_id = $parent[0]->getId();
    }
    // if parent element is not root of the tree
    else
    {
        $parent_id = $parent[0]->getParent()->getId();
    }

    return $parent_id;
}

使用する$parent = $query->getResult()と、次の出力が得られます。

array:1 [?
  0 => Category {#581 ?
    -id: 3
    -title: "Vegetables"
    -is_file: false
    -lft: 4
    -lvl: 1
    -rgt: 11
    -root: Category {#518 ?}
    -parent: Category {#518 ?
      -id: 1
      -title: "Food"
      -is_file: false
      -lft: 1
      -lvl: 0
      -rgt: 12
      -root: Category {#518}
      -parent: null
      -children: 

しかし、使用すると次のよう$parent = $query->getArrayResult()になります。

array:1 [?
  0 => array:6 [?
    "id" => 2
    "title" => "Fruits"
    "is_file" => false
    "lft" => 2
    "lvl" => 1
    "rgt" => 3
  ]
]

出力にparent_idがないことに注意してくださいgetArrayResult...

質問

問題はparent_id、クエリ結果でツリー ノードを取得するにはどうすればよいかということgetArrayResultです。

結論

お知らせ下さい。

お時間と知識をありがとうございました。

4

1 に答える 1

3

を使用する場合、関連するすべての値を取得するにはヒントが必要getArrayResultです。

バニラの回答 [1] はうまくいかなかったので、少し変更しました (クエリへのフル パス)。

$query->setHint(\Doctrine\ORM\Query::HINT_INCLUDE_META_COLUMNS, true);

ヒントは$queryクエリで実行され、クエリと結果の取得の間に配置されることに注意してください。

リンク:

  1. 初期情報はこちら
  2. ヒントに関するドキュメント
于 2016-11-01T22:15:04.180 に答える