Заставить доктрину возвращать поля базы данных в качестве ключей для возвращаемых данных - PullRequest
0 голосов
/ 10 мая 2019

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

Пример

У меня есть свойство gridId (camelCase), которое отображается в поле базы данных с именем grid_id (snake_case), как показано на рисунке выше. Ключ для строк, возвращаемых для этого свойства, будет gridId, а не grid_id, что желательно в моем случае.

Пример текущей ситуации: изображение .

Желаемая ситуация:

$grid = 
[
    grid_block_id = 18

    width = 50

    width_pixels = 50
]

Изменение полей базы данных или имен свойств в моем случае не вариант.

EDIT

Я использую JMS в качестве сериализатора. Я думаю, 4-й вариант ответа @ Jakumi , вероятно, является лучшим вариантом для моего варианта использования. Каким-то образом используйте сериализатор для возврата имени столбца свойства в качестве ключа для возвращаемых значений.

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

1 Ответ

0 голосов
/ 10 мая 2019

так что вы говорите ... вы хотите активно игнорировать объектно-реляционное отображение (ORM), которое предоставляет вам доктрина ORM, которую вы используете, и которая фактически предоставляет ключи именно так, как ваша сущность называет их?

Полагаю, для этого есть веская (или не очень) причина.В зависимости от вашего варианта использования, лучшие решения могут быть лучшими.Опции, включая (но, вероятно, очень неполные):

опция 1: добавить функцию к сущности

class Grid {
    /** all your fields **/

    public function toArray() {
        return [
            'grid_id' => $this->gridId,
            // ...
        ];
    }
}

опция 2: не использовать orm

добавитьФункция в вашем GridRepository, как:

function getRawAll() {
    $conn = $this->getEntityManager()->getConnection();
    $_result = $conn->query('SELECT * FROM grid');
    $results = [];
    while($row = $_result->fetch()) {
        $results[] = $row;
    }

    return $results;
}

и аналогичные.Те, очевидно, обходят ORM.ORM предназначен для извлечения объектов, которые имеют указанные поля.

вариант 3: вернуть данный массив обратно в не отображенное состояние

, используя EntityManager getClassMetadata (ClassMetadataInfo -> fieldMapping), чтобы получить сопоставление для ваших полей и «отменить» переименование.

Это, вероятно, немного лучше, чемвариант 1 до некоторого градуса, поскольку его не нужно обновлять.

вариант 4: используйте сериализатор, который выполняет перевод имени вашего свойства.

, поскольку вы 'очевидно, что уже используется сериализатор jms , аннотация SerializedName, вероятно, может помочь, хотя по умолчанию используется случай змеи, но, может быть, где-то он переопределен?Вы можете проверить свою конфигурацию ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...