Symfony Querybuilder оставил объединение массивов слияния - PullRequest
0 голосов
/ 11 октября 2018

В настоящее время я столкнулся с проблемой при использовании построителя запросов и левого соединения.Чего я хочу добиться - это выбрать все столбцы в Article-Entity и, используя левое соединение с двумя условиями, «добавить» поле к этому массиву.Во фрагменте вы увидите рабочий запрос без объединения, а также запрос с левым объединением и их результаты.

Я знаю, что вы можете использовать "getScalarResult", но это также дает результат, показанный во фрагменте- это префикс всех столбцов таблицы «Статья».Я хотел бы, чтобы этот результат был без префиксов "a_".

Я знаю, что вы можете перечислить поля таблицы в операторе select, но я не хочу, чтобы этот запрос был статическим, а имел бы динамический характер, когдаструктура таблицы может измениться.

// default query
return $this->createQueryBuilder('a')
            ->andWhere('a.publishedAt IS NOT NULL')
            ->andWhere('a.publishedAt <= CURRENT_TIMESTAMP()')
            ->andWhere('a.status = 2')
            ->orderBy('a.publishedAt', 'DESC')
            ->getQuery()
            ->getResult();
// default result
array:5 [
  0 => Article {#723 
    -id: 18
    -title: "Title!"
    -slug: "slug"
    -content: "content"
    -image: "img.jpg"
    -author: BackendUser {#817 ▶}
    -status: 2
    -publishedAt: DateTime @1536546264 {#720 ▶}
    -ratingPositive: 1
    -ratingNegative: 0
    -articleRatings: PersistentCollection {#816 ▶}
    #createdAt: DateTime @1539163998 {#715 ▶}
    #updatedAt: DateTime @1539180102 {#709 ▶}
  }
  ...
]



// Left-Join-Query:
return $this->createQueryBuilder('a')
            ->andWhere('a.publishedAt IS NOT NULL')
            ->andWhere('a.publishedAt <= CURRENT_TIMESTAMP()')
            ->andWhere('a.status = 2')
            ->leftJoin('App\Entity\Article\ArticleRating', 'ar', 'WITH', 'ar.article = a.id AND ar.user = ' . $userId)            
            ->addSelect('ar.rating as userRating')
            ->orderBy('a.publishedAt', 'DESC')
            ->getQuery()
            ->getResult();

// Left Join Result
array:5 [
  0 => array:2 [
    0 => Article {#722 ▼
      -id: 18
      -title: "Title"
      -slug: "Slug"
      -content: "Content"
      -image: "image.jpg"
      -author: BackendUser {#817 ▶}
      -status: 2
      -publishedAt: DateTime @1536546264 {#689 ▶}
      -ratingPositive: 1
      -ratingNegative: 0
      -articleRatings: PersistentCollection {#816 ▶}
      #createdAt: DateTime @1539163998 {#737 ▶}
      #updatedAt: DateTime @1539180102 {#732 ▶}
    }
    "userRating" => true
  ]
  ...
]



// getScalarResult - result
array:5 [▼
  0 => array:12 [▼
    "a_id" => 18
    "a_title" => "Title"
    "a_slug" => "slug"
    "a_content" => "content"
    "a_image" => "image.jpg"
    "a_status" => 2
    "a_publishedAt" => DateTime @1536546264 {#689 ▶}
    "a_ratingPositive" => 1
    "a_ratingNegative" => 0
    "a_createdAt" => DateTime @1539163998 {#737 ▶}
    "a_updatedAt" => DateTime @1539180102 {#732 ▶}
    "userRating" => "1"
  ]
  ...
]

Мой желаемый результат будет выглядеть примерно так:

array:5 [
    0 => Article {#722 ▼
      -id: 18
      -title: "Title"
      -slug: "Slug"
      -content: "Content"
      -image: "image.jpg"
      -author: BackendUser {#817 ▶}
      -status: 2
      -publishedAt: DateTime @1536546264 {#689 ▶}
      -ratingPositive: 1
      -ratingNegative: 0
      -articleRatings: PersistentCollection {#816 ▶}
      #createdAt: DateTime @1539163998 {#737 ▶}
      #updatedAt: DateTime @1539180102 {#732 ▶}
      -userRating- => true
    }
  ...
]
...