Троичная логика (ternary logic) в Doctrine ORM

В этой статье речь пойдет о третичной логике. Я не буду говорить об операциях в троичной логике, а коснусь лишь вопросов хранения данных в Doctrine.

Представим, что есть некоторый столбец в БД, данные которого могут принимать три возможных значения. Для хранения типа boolean (двоичная логика) Doctrine используется тип данных boolean в PHP, а при отражении в таблицу он проектируется в tinyint(1). Но как тогда кодировать третье значение? Мы будем использовать NULL. Т.е. область определения = {0,1,NULL}. Значит notnull => false. Но тогда возникает одна проблема.

При этом срабатывает приведение типов, и в БД сохраняется 0, а не NULL. Приведение типов столбцов закодировано в файле Doctrine_Record::getPrepared():

А для типа boolean срабатывает вот этот case:

Определение столбца выглядело следующим образом:

Не буду томить с решением проблемы, во общем всё портил параметр default. После его изменения на default=>NULL в базу стали сохраняться правильные значения.

Литература

http://stackoverflow.com/questions/1391777/how-do-i-insert-null-values-using-pdo
http://php.net/manual/en/pdostatement.bindparam.php

2 Comments

  1. по идее нужно использовать Expression, в первой ветке делалось так.
    $model->ternary_field = new Doctrine_Expression(‘NULL’);

Leave a Reply to AmdY Cancel reply