Я использую 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
Странный. Поле БД дважды проверено целым числом?
Да, это известная проблема, как вы также можете увидеть здесь: github.com/phalcon/cphalcon/issues/11091, но для меня все еще нет решения
Я только что читал Вот этот. Кажется, PDO работает именно так.






Похоже, вы пытаетесь определить свойство 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.
Как это будет выглядеть, если вы выберете
var_dump($customer)?