Doctrine QueryBuilder выбирает отношение один ко многим - PullRequest
0 голосов
/ 12 июня 2018

У меня есть 2 сущности с отношением один ко многим.Мне нужно выбрать имя как из сущности 1, так и из сущности 2

$qb
    ->select(['f.name1', 'c.name2'])
    ->from('BundleOne:EntityOne', 'c')
    ->innerJoin('c.EntityTwo', 'f');

return $qb->getQuery()->getArrayResult();

С помощью вышеуказанного запроса я получаю следующие результаты:

1 => array:2 [ 
    "name1" => "xyz" 
    "name2" => "n1" 
] 
2 => array:2 [ 
    "name1" => "xyz" 
    "name2" => "n2" 
] 
3 => array:2 [ 
    "name1" => "abc" 
    "name2" => "n3" 
] 
4 => array:2 [ 
    "name1" => "abc" 
    "name2" => "n4" 
]

Как вы можете заметить, так как этоотношение один-ко-многим, name1 может иметь несколько name2, связанных с ним, и вместо вышесказанного я хочу вернуть результат следующим образом:

"xyz" => array:2 ["n1", "n2"]
"abc" => array:2 ["n3", "n4"]

, то есть name1 как ключ массива, который содержит все name2

Возможно ли это?

1 Ответ

0 голосов
/ 15 июня 2018

Вы можете сделать это следующим образом (вы не предоставили ни одного реального примера сущностей, поэтому я создал два самостоятельно, ради простоты):

#Category 1-N Product
#AppBundle/Repository/CategoryRepository.php
public function getProducts()
{
    $qb = $this
        ->createQueryBuilder('c')
        ->select('c, p')
        ->leftJoin('c.products', 'p')
    ;

    return $qb->getQuery()->getArrayResult();
}

Затем вконтроллер:

#AppBundle/Controller/DefaultController.php
public function indexAction()
{
    $categories = $this->getDoctrine()->getRepository('AppBundle:Category')->getProducts();
    $results = [];
    foreach($categories as $category) {
        $results[$category['name']] = $category['products'];
    }

    return $this->render('...', [
        'results' => $results,
    ]);
}

Результаты будут отображаться так:

array:2 [▼
  "category1" => array:3 [▼
    0 => array:2 [▼
      "id" => 1
      "name" => "product1"
    ]
    1 => array:2 [▼
      "id" => 2
      "name" => "product2"
    ]
    2 => array:2 [▼
      "id" => 3
      "name" => "product3"
    ]
  ]
  "category2" => array:2 [▼
    0 => array:2 [▼
      "id" => 4
      "name" => "product1"
    ]
    1 => array:2 [▼
      "id" => 5
      "name" => "product2"
    ]
  ]
]
...