0

Doctrine 2 ORM、Zendframework 2 を使用しています

Role Entity の Entity 属性は次のようになります

/**
     *
     * @ORM\Column(type="string")
     */
    protected $name;

   /**
     *
     * @ORM\OneToMany(targetEntity="\Application\Entity\Role", mappedBy="parent")
     */
    protected $children;

    /**
     *
     * @ORM\ManyToOne(targetEntity="\Application\Entity\Role", inversedBy="children")
     * 
     */
    protected $parent;

Mysql テーブルは次のようになります。

ここに画像の説明を入力

私が探している結果は配列です。重要なことの 1 つは、値が表示される前の配列内のすべてのエントリをキーとして追加する必要があることです. したがって、順序は非常に重要です.

つまり、[site-manager] => ゲスト (値) がキーとして配列に存在しないため、[ゲスト] => その前に存在しない場合、ゲストは最初のエントリ (0 インデックス) として来ることができないため、[ゲスト] => はテーブルの 2 番目のレコードとして入力された場合でも最初に来る

Array(
[guest] => 
[site-manager] => guest
[company-manager] => site-manager
[member] => guest
[staff] => member
[internalstaff] => member
[sales] => staff
[manager] => sales,internalstaff
[admin] => manager
)

空の配列を返すコントローラーでこのコードを実行しています

$qb = $objectManager->createQueryBuilder();
        $qb->select('r, p')
                ->from('\Application\Entity\Role', 'r')
                ->innerJoin('r.parent','p', 'with','p.id = r.id')
                //->where('b.id = ?1')
                ->orderBy('r.id', 'ASC');

        $data = $qb->getQuery()->getArrayResult();

どんな助けでも大歓迎です

4

1 に答える 1

0

1つの解決策は

    $qb = $objectManager->createQueryBuilder();
            $qb->select('r.name', 'c.name as children')
                    ->from('\Application\Entity\Role', 'r')
                    ->join('r.parent','c');

            $data = $qb->getQuery()->getArrayResult();

            $refine =  array();
            foreach ($data as $v)
            {
                if(is_array($v))
                {
                    if(array_key_exists($v["children"], $refine)){
                        $refine[$v["name"]][] = $v["children"];    
                    } else {
                        $refine[$v["children"]] = array();    
                        $refine[$v["name"]][] = $v["children"];    
                    }

                }

            }
 print_r($refine);

次のように返されます

Array
(
    [guest] => Array
        (
        )

    [site-manager] => Array
        (
            [0] => guest
        )

    [company-manager] => Array
        (
            [0] => site-manager
        )

    [member] => Array
        (
            [0] => guest
        )

    [staff] => Array
        (
            [0] => member
        )

    [internalStaff] => Array
        (
            [0] => member
        )

    [sales] => Array
        (
            [0] => staff
        )

    [manager] => Array
        (
            [0] => internalStaff
            [1] => sales
        )

    [admin] => Array
        (
            [0] => manager
        )

)

内部配列を平坦化したい場合は、 implode関数を使用できます

于 2013-09-12T15:57:34.443 に答える