Phalcon ORM - целочисленный идентификатор поля является строкой после сохранения

Я использую Phalcon для своего текущего проекта и наблюдаю странное поведение при приведении типов.

У меня есть эта модель

class Customer extends Model {
    protected $id;
    protected $name;
}

В своем сервисе я сохраняю новую модель Customer вот так:

$customer = new Customer();
$customer->name = 'test';
$customer->save();
var_dump($customer->id);

Проблема, с которой я столкнулся, заключается в том, что id - это строка, а не integer. В db злодей, конечно же, - это автоматический инкремент int, первичный ключ.

Кроме того, я уже добавил эти строки в свое соединение с базой данных

\Pdo::ATTR_PERSISTENT => false,
\Pdo::ATTR_EMULATE_PREPARES => false,
\Pdo::ATTR_STRINGIFY_FETCHES => false,

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

Я не хочу использовать геттер для идентификатора, поскольку я реализовал другую функцию с помощью магических сеттеров / геттеров.

Любое решение по этой проблеме?

Как это будет выглядеть, если вы выберете var_dump($customer)?

Tpojka 19.06.2018 12:15

Идентификатор - это строка, когда я var_dump $ customer

GeorgeGeorgitsis 19.06.2018 12:18

Странный. Поле БД дважды проверено целым числом?

Tpojka 19.06.2018 12:27

Да, это известная проблема, как вы также можете увидеть здесь: github.com/phalcon/cphalcon/issues/11091, но для меня все еще нет решения

GeorgeGeorgitsis 19.06.2018 12:34

Я только что читал Вот этот. Кажется, PDO работает именно так.

Tpojka 19.06.2018 12:38
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
5
254
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Похоже, вы пытаетесь определить свойство protected $name вне области видимости объекта.

Вы должны либо сделать свойство $name общедоступным, либо использовать сеттер, например $customer->setName('test');

Модель Phalcon предоставляет такие функции, как beforeSave и afterFetch, которые вы можете использовать для преобразования идентификатора в целое число.

Ответ принят как подходящий

Правильная проблема для этой проблемы - https://github.com/phalcon/cphalcon/issues/13002, и теперь она решена. Просто используйте

Model::setup([ 'castLastInsertIdToInt' => TRUE ]);

в вашем начальном загрузке, чтобы активировать обходной путь глобально

Вы также можете использовать ini_set('phalcon.orm.cast_last_insert_id_to_int', 'on'); (или, конечно, установить это в файле php.ini) - протестировано в Phalcon 4.1.

BeesonBison 07.02.2021 09:16

Другие вопросы по теме