Im tratando de conservar una doctrina entidad con un campo booleano donde los valores son 0 o 1.

Cuando la propiedad se establece en true, guardar como ‘1’ en la base de datos.
Pero cuando su ‘falso’ o ‘0’, es guardarlo como NULL en la base de datos.

Cómo puedo solucionar este problema para guardar sólo sólo como 1 o 0 ?

La anotación de la propiedad en el que yo uso es el siguiente:

@ORM\Column(name="substitute", type="boolean", nullable=true)

Cuando me puse acepta valores null false, no puedo persisten es porque todavía desea establecer en null.

Gracias

Cuando me persiste, el valor del campo es 0

Intento 1
@ORM\Column(name=»sustituto», type=»boolean», opciones={«default»:»0″}))

error: no se Puede guardar null

Intento 2
@ORM\Column(name=»sustituto», type=»boolean», que acepta valores null= true, opciones={«default»:»0″}))

No funciona, todavía guardar null en la base de

Info 1

El hecho de consulta insert está tratando de insertar 0. Pero tengo este error «ORA-01400: no se puede insertar el valor NULL en (\»MYBASE\».\»MYTABLE\».\»SUSTITUTO\»)»

Info 2

Mismo anexar otra entidad con la que

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;
}

La persistencia de

$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)"} []

Info 3

Insertar manualmente funciona mediante oci o oci8 conductor

sql> INSERT INTO TestEntity (test_entity_id, substitute) VALUES (13, 0)
[2017-04-06 11:21:15] 1 row affected in 62ms
  • Tenga en cuenta que el valor predeterminado: 0 material es estrictamente para la base de datos. La doctrina en sí misma no establece ningún defecto en su entidad. private $sustituto = false; debería funcionar. Si no lo hace, entonces usted tiene algo más para cambiar el valor.
  • Cuando la depuración de la línea de $em->persist($afectación), el valor del campo es correctamente ‘false’. La realidad de consulta insert reemplazado el ‘falso’ a ‘0’, Pero me sale el error «no se puede insertar el valor NULL»…
  • Suena como un problema de configuración o un controlador de edición. Es tu conexión de Oracle funciona correctamente con otras Entidades? Supongo que he de instalación de oci8 correctamente?
  • estoy usando la oci conductor. (no la oci8). No tengo otras entidades con este caso.
  • Si usted está usando Symfony con Oracle usted debe utilizar oci8. Sus parámetros.yml archivo debe tener: database_driver: oci8 he creado un artículo sobre instalar OCI8 en RHEL si usted necesita ayuda. Básicamente de acuerdo a Oracle y el Metro de PHP y Oracle Manual, usted debe utilizar oci8 con PHP.
  • He leído tu artículo, que es interesante. Primera vez que voy a usar esto si realmente no se puede solucionar de otra manera.
  • He cambiado mi doctrina dbal controlador de pdo_oci a oci8. Y funciona. Muchas gracias. Podría crear una respuesta que me permita marcar como resuelto ?
  • He añadido una segunda respuesta. Me alegro de que tengo trabajo!

InformationsquelleAutor fliim | 2017-04-05

4 Comentarios

  1. 8

    Sólo tienes que configurar el SQL por Defecto el valor 0 (Edit: es necesario actualizar el esquema después de que el cambio):

    /**
     * @ORM\Column(type="boolean", options={"default":"0"})
     */
    protected $isActive;

    También se puede inicializar la propiedad por defecto:

    /**
     * @ORM\Column(type="boolean", options={"default":"0"})
     */
    protected $isActive = false;

    Que aceptan valores null no importa siempre y cuando el valor se establece en true/false.

    Si usted realmente poner la propiedad a false antes de ahorro y todavía guarda como null en la base de datos, a continuación, algo más está pasando.

    • Gracias, por tu respuesta. Yo voy a probar y decir si trabajo en un momento.
    • Todavía se me pone un error después de cambiar la anotación (y actualizar el esquema) @ORM\Column(name=»sustituto», type=»boolean», opciones={«default»:»0″})). Él está tratando de conjunto null en caso de no campo acepta valores null. Voy a tratar de establecer que aceptan valores null=true
    • No funciona ninguno de los dos. Guardar el valor null en el campo.
    • Eso es realmente extraño. ¿Tienes un depurador que se ejecuta? Si es así usted debe comprobar si la propiedad se establece en true o false a la derecha antes de que sea escrito a la base de datos. También puedes echar un vistazo a la sfToolbar y búsqueda para la consulta real que consiguió que se ejecuta contra la base de datos para comprobar que los valores se pasan desde el objeto
    • ¿de verdad has actualizado su esquema y se borra la memoria caché?
    • Yo no borra el caché de mi, acaba de actualizar el esquema y comprobado que la propiedad de campo en la base de datos es actuelly cambiado.
    • La realidad de consulta insert está tratando de insertar 0. Pero tengo este error «ORA-01400: no se puede insertar el valor NULL en (\»MYBASE\».\»MYTABLE\».\»SUSTITUTO\»)»… Muy extraño comportamiento

  2. 1

    Creo que @Cerad la sugerencia es correcta, puede intentar:

    /**
     * @ORM\Column(name="substitute", type="boolean")
     */
    protected $substitute = false;

    Nos deja saber el resultado.

    • Yo lo hice también. No funciona. Como he dicho en el comentario: El hecho de consulta insert está tratando de insertar 0. Pero tengo este error «ORA-01400: no se puede insertar el valor NULL en (\»MYBASE\».\»MYTABLE\».\»SUSTITUTO\»)»… Muy extraño comportamiento
    • Tal vez intente conectarse a la base de datos a través de una ventana de consola y ejecutar manualmente una simple instrucción INSERT INTO.
    • Me pueden insertar manualmente con la misma consulta.
  3. 0

    Me acaba de replicar su caso, y me las arreglé para poder guardar en la db 1 para verdadero y 0 para falso.

    Ejemplo:

    //Entity
    Person: id, name, isMajor(boolean field)
    //IMPORTANT: I setted the boolean field inside __construct() method, and let it be, by default, false (0). This means you don't need anymore to have that options={"default":"0"}.
    
    //...
    /**
     * @var bool
     *
     * @ORM\Column(name="isMajor", type="boolean", nullable=true)
     */
    private $isMajor;
    
    public function __construct() 
    {
        $this->isMajor = false;
    }
    
    //Created CRUD against the Entity
    
    //When saving (either using the default actions provided by the CRUD, or by setting the values inside another controller's action):
    //AppBundle/Controller/DefaultController.php
    /**
     * @Route("/new-person")
     */
    public function createAction()
    {
        $person = new Person();
        $person->setName('name');
        $person->setIsMajor(true); //this saves 1 in the table
        $person->setIsMajor(false); //this saves 0 in the table
    
        $em = $this->getDoctrine()->getManager();
        $em->persist($person);
        $em->flush();
    
        return $this->redirectToRoute('person_index');
    }

    Espero que me hizo entendido bien tu problema.

    • ¿El uso de una base de datos oracle con pdo_oci conductor ?
    • Oh, lo siento, en este ejemplo se está utilizando el viejo de buen mysql como RDBM.

Dejar respuesta

Please enter your comment!
Please enter your name here