Doctrine: Relación muchos a muchos con campos extras
18/04/2017
|Por Yoné Rocha
En el supuesto de tener una relación muchos a muchos (N-M) entre dos entidades cualesquiera y necesitar campos extras en la la tabla intermedia de dicha relación. Para esto se puede crear una entidad intermedia con dos relaciones uno a muchos (1-N) a las dos entidades originarias.
PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | namespace AppBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * * * @ORM\Table(name="participants") * @ORM\Entity(repositoryClass="AppBundle\Repository\ParticipantsRepository") */ class Participants { /** * @var integer * * @ORM\Column(name="nid", type="bigint") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") * */ private $nid; /** * @var string * * @ORM\Column(name="name", type="string", length=100, nullable=true) */ private $name; /** * Bidirectional - uno a muchos (INVERSE SIDE) Para poner atributos extras en una relación N-M * * @ORM\OneToMany(targetEntity="ParticipantsHasAwards", mappedBy="participant", cascade={"all"}) * */ private $participantHasAwards; ////////Incluir Getters y Setters de la entidad } |
PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | namespace AppBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * * @ORM\Table(name="participants_has_awards") * @ORM\Entity(repositoryClass="AppBundle\Repository\ParticipantsHasAwardsRepository") */ class ParticipantsHasAwards { /** * Bidirectional - muchos a uno (OWNING SIDE) * * * @ORM\Id * @ORM\ManyToOne(targetEntity="Participants", inversedBy="participantHasAwards") * @ORM\JoinColumn(name="par_id", referencedColumnName="nid", * columnDefinition="bigint COMMENT 'Un participante podrá tener muchos premios'", nullable=false, onDelete="CASCADE") * */ private $participant; /** * Bidirectional - muchos a uno (OWNING SIDE) * * * @ORM\Id * @ORM\ManyToOne(targetEntity="Awards", inversedBy="awardHasParticipants") * @ORM\JoinColumn(name="awa_id", referencedColumnName="nid", * columnDefinition="bigint COMMENT 'Un premio se le otorga a muchos participantes'", nullable=false,) * */ private $award; /** * @var string * * @ORM\Column(name="synchronized", type="smallint", nullable=true, options={ * "comment":"Para marcar si ya ha sido sincronizado"}) */ private $synchronized; /** * Al recuperar el objeto desde Participants, se devuelve __toString con el nombre del premio * */ public function __toString() { try { return $this->getAward()->getName(); } catch (Exception $exception) { return ''; } } ////////Incluir Getters y Setters de la entidad } |
PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | namespace AppBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * * * @ORM\Table(name="award") * @ORM\Entity() */ class Awards { /** * @var integer * * @ORM\Column(name="nid", type="bigint") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") * */ private $nid; /** * @var string * * @ORM\Column(name="name", type="string", length=250) */ private $name; /** * Bidirectional - uno a muchos (INVERSE SIDE) Para poner atributos extras en una relación N-M * * @ORM\OneToMany(targetEntity="ParticipantsHasAwards", mappedBy="award", cascade={"all"}) * */ private $awardHasParticipants; ////////Incluir Getters y Setters de la entidad } |