#php #mysql #sql #doctrine-orm #doctrine
Вопрос:
Мне нужно присоединиться к Доктрине. Я протестировал несколько комбинаций входных данных для метода select и заметил, что различные форматы значений изменяются в зависимости от доктрины.
Пример 1:
Код:
$queryBuilder
->select('d1, d2.word')
->from('AppEntityDictionary', 'd1')
->join(
'AppEntityDictionary',
'd2',
DoctrineORMQueryExprJoin::WITH,
'd1.mainKey = d2.mainKey'
);
Результат:
[
0 => [
0 => [
"id" => 1,
"mainKey" => "dog",
"word" => "dog",
"language" => "english"
],
"word" => "pies"
],
1 => [
0 => [
"id" => 3,
"mainKey" => "cat",
"word" => "cat",
"language" => "english"
],
"word" => "kot"
]
]
Мне это идет на пользу.
Пример 2:
Код:
$queryBuilder
->select('d1, d2')
->from('AppEntityDictionary', 'd1')
->join(
'AppEntityDictionary',
'd2',
DoctrineORMQueryExprJoin::WITH,
'd1.mainKey = d2.mainKey'
);
Результат:
[
0 => [
"id" => 1,
"mainKey" => "dog",
"word" => "dog",
"language" => "english"
],
1 => [
"id" => 2,
"mainKey" => "dog",
"word" => "pies",
"language" => "polish"
],
2 => [
"id" => 3,
"mainKey" => "cat",
"word" => "cat",
"language" => "english"
],
3 => [
"id" => 4,
"mainKey" => "dog",
"word" => "kot",
"language" => "polish"
]
]
In my opinion, it is not consistent with previous result.
Additionaly, if I will return the above result to the frontend (e.g. like json), it will require matching items by mainKey on frontend — e.g. to display english and polish version in the same row (like in dictionary).
I would expect something like this:
[
0 => [
0 => [
"id" => 1,
"mainKey" => "dog",
"word" => "dog",
"language" => "english"
],
1 => [
"id" => 2,
"mainKey" => "dog",
"word" => "pies",
"language" => "polish"
],
],
1 => [
0 => [
"id" => 3,
"mainKey" => "cat",
"word" => "cat",
"language" => "english"
],
1 => [
"id" => 4,
"mainKey" => "dog",
"word" => "kot",
"language" => "polish"
]
]
]
Example 3:
Code:
$queryBuilder
->select('d1.word, d2.word')
->from('AppEntityDictionary', 'd1')
->join(
'AppEntityDictionary',
'd2',
DoctrineORMQueryExprJoin::WITH,
'd1.mainKey = d2.mainKey'
);
Результат:
result = [
0 => [
"word" => "dog"
],
1 => [
"word" => "cat"
],
2 => [
"word" => "pies"
],
3 =>[
"word" => "kot"
]
]
Результат не содержит никакой связи между конкретными элементами. Невозможно сопоставить связанные элементы на основе данных в массиве.
Я ожидал бы следующего ответа:
[
0 => [
0 => [
"word" => "dog",
],
1 => [
"word" => "pies"
]
],
1 => [
0 => [
"word" => "cat",
],
1 => [
"word" => "kot"
]
]
]
Мой вопрос: могу ли я что-то сделать, чтобы получить ожидаемые результаты в Доктрине, или, может быть, моя идея/понимание просто неправильны?
Комментарии:
1. Вы также должны поделиться этими сущностями, иначе мы не знаем, как вы установили эти отношения между этими двумя сущностями.