Closed4

DoctrineでOne-To-ManyのChildでソートする

BonyChopsBonyChops

タイトルが適切かは微妙

$query = $this->createQueryBuilder('c')
    ->where('c.id = :id')
    ->setParameter('id', $id)
    ->innerJoin('c.items', 's', 'WITH', 'c.id = :id')
    ->orderBy("s.createdAt", "ASC")
    ->getQuery();

上記のようにしたとき,明らかにs.createdAtでソートされていないように見える

BonyChopsBonyChops

$query->getResult()[0]->getItems()の中身を見てみると,PersistentCollectionという型が返ってきていることがわかる.

foreach($result->getItems() as $item){
    // 任意の処理...
}

上記のようにイテレータがよしなにやってくれるが,どこで順序を指定できるのか(orderByみたいに)...

BonyChopsBonyChops

結論

Selectで必要なものはちゃんと指定しましょう,という話だった.

  $query = $this->createQueryBuilder('c')
+   ->select(['c', 's'])
    ->where('c.id = :id')
    ->setParameter('id', $id)
    ->innerJoin('c.items', 's', 'WITH', 'c.id = :id')
    ->orderBy("s.createdAt", "ASC")
    ->getQuery();
このスクラップは2023/02/07にクローズされました