Доктрина различное поведение построителя запросов, вызванное входными данными в методе select

#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. Вы также должны поделиться этими сущностями, иначе мы не знаем, как вы установили эти отношения между этими двумя сущностями.