Symfony2: Como manejarse con una fecha que tenga el valor null

Punto de partida: Trabajo con Symfony 2.8 y he diseñado la base de datos y las tablas que la componen con el software MySQL Workbench. Luego, hice exportar el esquema y crear la base de datos.
En Symfony 2.8, procedí a importar la base de datos ya creada y a generar las entidades.

Manejo de una fecha con valor null en un formulario diseñado con Twig

Mi problema: Tengo una tabla llamada Contratos (ver estructura en la imagen siguiente) con un campo fecha del tipo DateTime llamado fechaArchivo que puede ser nulo (valor=null).

Mi problema era que al utilizar las plantillas new.html.twig o edit.html.twig, Tiwg me exigía completar el valor del campo y no permitía dejarlo en blanco ni colocar una fecha igual a:”0000-00-00″. La solución está en utilizar la condición ‘required’ => false

contratos

Estructura de la tabla Contratos

Aquí la solución detallada con todos los archivos involucrados:

En el archivo donde se define la entidad Contratos, llamado Contratos.php tenemos:

 /**
     * @var \DateTime
     *
     * @ORM\Column(name='fecha_archivo', type='date', nullable=true)
     */
    private $fechaArchivo;

      /**
     * Set fechaArchivo
     *
     * @param \DateTime $fechaArchivo
     * @return Contratos
     */
    public function setFechaArchivo( \DateTime $fechaArchivo=null)
    {

       $this->fechaArchivo = $fechaArchivo;

        return $this;
    }

    /**
     * Get fechaArchivo
     *
     * @return \DateTime
     */
    public function getFechaArchivo()
    {
        return $this->fechaArchivo;
    }

En mi caso, como procedí a importar una base de datos ya existente, Symfony y Doctrine, crearon también un archivo llamado: Contratos.orm.xml que se muestra completo a continuación:

<?xml version="1.0" encoding="utf-8"?>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
  <entity name="BackendBundle\Entity\Contratos" table="contratos"  repository-class="BackendBundle\Entity\ContratosRepository">
    <indexes>
      <index name="fk_Contratos_Docentes1_idx" columns="docentes_id"/>
      <index name="fk_Contratos_Materias1_idx" columns="materias_id"/>
    </indexes>
    <id name="id" type="integer" column="id">
      <generator strategy="AUTO"/>
    </id>
    <field name="fechaInicio" type="date" column="fecha_inicio" nullable="false"/>
    <field name="fechaFinal" type="date" column="fecha_final" nullable="false"/>
    <field name="fechaFirma" type="date" column="fecha_firma" nullable="false"/>
     <field name="fechaArchivo" type="date" column="fecha_archivo" nullable="true"/>
    <field name="marcaImprimir" type="boolean" column="marca_imprimir" nullable="true"/>
    <field name="monto" type="decimal" column="monto" precision="10" scale="2" nullable="false"/>
    <field name="montoAdicional" type="decimal" column="monto_adicional" precision="10" scale="2" nullable="true"/>
    <many-to-one field="materias" target-entity="Materias">
      <join-columns>
        <join-column name="materias_id" referenced-column-name="id"/>
      </join-columns>
    </many-to-one>
    <many-to-one field="docentes" target-entity="Docentes">
      <join-columns>
        <join-column name="docentes_id" referenced-column-name="id"/>
      </join-columns>
    </many-to-one>
  </entity>
</doctrine-mapping>

Obsérvese con atención la línea 14 del código anterior, donde se fija el atributo nullable=”true” para el campo fechaArchivo

En el archivo donde se definen los atributos de los formularios, tengo:

 public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
             ->add('fechaInicio', 'date', array( 'attr' => array('style' => 'width: 80px'), 'widget' => 'single_text', 'format' => 'dd/MM/yyyy'))
            ->add('fechaFinal', 'date' ,  array( 'attr' => array('style' => 'width: 80px'), 'widget' => 'single_text', 'format' => 'dd/MM/yyyy'))
            ->add('fechaFirma', 'date',  array( 'attr' => array('style' => 'width: 80px'), 'widget' => 'single_text', 'format' => 'dd/MM/yyyy' ))
            ->add('fechaArchivo', 'date',  array('required' => false, 'attr' => array('style' => 'width: 80px'), 'widget' => 'single_text', 'format' => 'dd/MM/yyyy' ))
            ->add('materias')
            ->add('marcaImprimir')
            ->add('monto', 'money', array('currency'=>'ARS' ))
            ->add('montoAdicional', 'money', array('required' => false, 'currency'=>'ARS' ))
            ->add('docentes')
        ;
    }

Obsérvese que tengo cuatro campos fecha, donde tres son obligatorios y el campo fechaArchivo, puede ser null, entonces defino para ese campo la cualidad ‘required’ => false quedando la línea de código completa de la siguiente manera:

 ->add('fechaArchivo', 'date',  array('required' => false, 'attr' => array('style' => 'width: 80px'), 'widget' => 'single_text', 'format' => 'dd/MM/yyyy' ))

¡Y eso es todo! Tanto cuando creo un registro nuevo, como cuando edito uno ya existente, no necesito asignar ningún valor al campo fechaArchivo si no es necesario. Si observamos la tabla con phpMyAdmin, vemos que todos los registros que no tienen una fecha cargada en el campo fechaArchivo, poseen un valor igual a null que yo definí como valor por defecto.

Manejo de una fecha con valor null en una consulta con el uso de Doctrine y Symfony2

Mi problema: ¿Como utilizar una fecha con valor null en una consulta en Symfony2 con Doctrine?
Imaginemos que necesito conocer todos los registros de una tabla que tengan un valor null en un campo fecha. ¿Como es la sintaxis de la consulta?

Solución:En el código de abajo se puede ver la sintaxis correcta para que funcione una consulta, cuando queremos conocer los registros del campo fechaArchivo, que tengan un valor NULL.

public function findNull()
    {
        $em = $this->getEntityManager();

        $consulta = $em->createQuery('
            SELECT c, d, m
            FROM BackendBundle:Contratos c
            JOIN c.docentes d
            JOIN c.materias m
            WHERE c.fechaArchivo IS NULL

            ORDER BY d.apellido, d.nombres
        ');

        return $consulta->getArrayResult();
    }

¿Como mostrar una fecha con valor NULL en un listado de una plantilla de Twig?

Mi problema: Siguiendo con el ejemplo del campo fechaArchivo, si quiero mostrar en un plantilla de Twig el valor de este campo fecha, debo utilizar la siguiente sintaxis para evitar un mensaje de error:

 {% for contrato in contratos %}
                {% if contrato.fechaArchivo %}{{ contrato.fechaArchivo|date('d-m-Y') }}{% endif %}
        {% endfor %}

Esta sintaxis es la correcta para cualquier campo fecha, sea que pueda tener un valor NULL o no. Si el valor fuese NULL, simplemente Twig no mostrará ningún valor en el listado correspondiente.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s