symfony formularios EntityType

supongamos que tenemos la entidad Employee y otra llamada Nacionality :D
un empleado tiene una nacionalidad y una misma nacionalidad la pueden tener muchos empleados
la relacion es de manytoone. (y se modela en Employee ya que es quien en la tabla tendrá el foreign_key)

la idea es que en el formulario de creacion de empleado, podamos seleccionar su nacionalidad de una lista de nacionalidades, esto se lografacilmente con EntityType, veamos:

use Symfony\Bridge\Doctrine\Form\Type\EntityType;
...

class EmployeeType extends AbstractType
{
 
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
..

)->add('nacionality', EntityType::class, [
    'class' => 'AppBundle:Nacionality',
    // use the Nacionality.name property as the visible option string
    'choice_label' => 'name',
   
    // used to render a select box, check boxes or radios
    // 'multiple' => true,
    // 'expanded' => true,
])

por default nos va a ordenar la lista por name alfabeticamente ASCendente.
que pasaría si quisiera cambiar el orden o filtrar la lista por alguna otra condicion?

usamos el atributo query_builder

use Doctrine\ORM\EntityRepository;

->add('nacionality', EntityType::class, [
    'class' => 'AppBundle:Nacionality',
    // use the User.username property as the visible option string
    'choice_label' => 'name',
    'query_builder' => function (EntityRepository $er) {
                return $er->createQueryBuilder('u')
            ->orderBy('u.name', 'DESC');
    },
    // used to render a select box, check boxes or radios
    // 'multiple' => true,
    // 'expanded' => true,
    ])

una mejor manera es crear la query en el repository correspondiente a la entity,
entonces en nuestro caso en NacionalityRepository, creamos:

public function createAlphabeticalQueryBuilder()
{
return $this->createQueryBuilder('nacionality')
->orderBy('nacionality.name', 'DESC');
}

entonces nuestro query_builder en el form type quedaría asi:

'query_builder' => function (EntityRepository $er) {
    return $er->createAlphabeticalQueryBuilder()
    ;
    }


si queremos que la primera opción de la lista sea un texto del tipo "Seleccione una nacionalidad"
agregamos estas lineas

->add('nacionality', EntityType::class, [
    'class' => 'AppBundle:Nacionality',
    // use the User.username property as the visible option string
    'choice_label' => 'name',
    'query_builder' => function (EntityRepository $er) {
    return $er->createQueryBuilder('u')
    ->orderBy('u.name', 'DESC');
    },
    'placeholder' => 'Seleccione la nacionalidad',
    'empty_data'  => null
    ]);

previamente tendremos que haber creado, la entidad Nacionality:

<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Nacionality
 *
 * @ORM\Table(name="nacionality")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\NacionalityRepository")
 */
class Nacionality
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=255, unique=true)
     */
    private $name;


    /**
     * Get id
     *
     * @return integer
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set name
     *
     * @param string $name
     * @return Nacionality
     */
    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }

    /**
     * Get name
     *
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }
}

y en Employee generar la relacion:

/**
     * @ORM\ManyToOne(targetEntity="Nacionality")
     * @ORM\JoinColumn(nullable=true)
     */
    private $nacionality;

    /**
     * nacionality
     * @return Nacionality
     */
    public function getNacionality(){
        return $this->nacionality;
    }

    /**
     * nacionality
     * @param Nacionality $nacionality
     * @return Employee
     */
    public function setNacionality($nacionality){
        $this->nacionality = $nacionality;
        return $this;
    }

No hay comentarios:

Publicar un comentario

linux ubuntu mint actualizar chrome

 desde una terminal: $ sudo apt update $ sudo apt install google-chrome-stable