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