Estoy tratando de mantener una entidad de doctrina con un campo booleano donde los valores son 0 o 1.
Cuando la propiedad se establece en verdadero, la guarda como '1' en la base de datos. Pero cuando es 'falso' o '0', lo guarda como NULL en la base de datos.
¿Cómo puedo arreglar esto para guardar solo como 1 o 0?
La anotación para la propiedad que uso es la siguiente:
@ORM\Column(name="substitute", type="boolean", nullable=true)
Cuando configuro anulable en falso, no puedo persistir porque todavía quiero establecerlo en nulo.
Gracias
Cuando lo persisto, el valor del campo es 0
Intento 1 @ORM\Column(name="substitute", type="boolean", options={"default":"0"}))
error: no se puede guardar nulo
Intento 2 @ORM\Column(name="substitute", type="boolean", nullable= true, options={"default":"0"}))
No funciona, todavía se guarda nulo en la base
Información 1
La consulta de inserción en realidad está tratando de insertar 0. Pero recibí este error "ORA-01400: no se puede insertar NULL en (\"MYBASE\".\"MYTABLE\".\"SUBSTITUTE\")"
Información 2
Mismo anexo con otra entidad
class TestEntity { /** * @ORM\Column(name="test_entity_id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ private $id; /** * @ORM\Column(name="substitute", type="boolean") */ private $isSubstitute = false; }
persistente
$test = new TestEntity(); $test->setIsSubstitute(false); $em->persist($test);
Resultado
request.CRITICAL: Uncaught PHP Exception Doctrine\DBAL\Exception\NotNullConstraintViolationException: "An exception occurred while executing 'INSERT INTO TestEntity (test_entity_id, substitute) VALUES (?, ?)' with params [7, 0]: SQLSTATE[HY000]: General error: 1400 OCIStmtExecute: ORA-01400: cannot insert NULL into ("MYBASE"."TESTENTITY"."SUBSTITUTE") (ext\pdo_oci\oci_statement.c:148)"\n (ext\\pdo_oci\\oci_statement.c:148) at PATH\\vendor\\doctrine\\dbal\\lib\\Doctrine\\DBAL\\Driver\\PDOStatement.php:91)"} []
Información 3
La inserción manual funciona con el controlador oci u oci8
sql> INSERT INTO TestEntity (test_entity_id, substitute) VALUES (13, 0) [2017-04-06 11:21:15] 1 row affected in 62ms
Simplemente establezca el valor predeterminado de SQL en 0 ( Editar: debe actualizar el esquema después de ese cambio ):
/** * @ORM\Column(type="boolean", options={"default":"0"}) */ protected $isActive;
También puede inicializar la propiedad de forma predeterminada:
/** * @ORM\Column(type="boolean", options={"default":"0"}) */ protected $isActive = false;
Nullable no debería importar siempre que el valor se establezca en verdadero/falso.
Si realmente establece la propiedad en falso antes de guardar y aún la guarda como nula en la base de datos, entonces está sucediendo algo más.
Cambie su controlador de oci
a oci8
en su archivo paramters.yml:
database_driver: oci8
Deberias hacer eso. Use el Manual subterráneo de PHP y Oracle para instalar OCI8.
Creo que la sugerencia de @Cerad es correcta, puedes probar:
/** * @ORM\Column(name="substitute", type="boolean") */ protected $substitute = false;
Dejanos saber el resultado.