В настоящее время я столкнулся с проблемой при использовании построителя запросов и левого соединения.Чего я хочу добиться - это выбрать все столбцы в 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
}
...
]