es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Relación Muchos a Muchos con Tipo Symfony Doctrine

Tengo esta estructura de entidades:

class Group
{
    /**
     * @var int
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private int $id;

    /**
     * @var string
     * @ORM\Column(name="name", type="string", length=50, nullable=false)
     */
    private string $name;
}


class GroupUser
{
    /**
     * @var int
     *
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private int $id;

    /**
     * @var Group
     * @ORM\ManyToOne(targetEntity="Group", inversedBy="GroupUser")
     * @ORM\JoinColumn(name="group_id", referencedColumnName="id", nullable=false)
     */
    private Group $group;

    /**
     * @var string
     * @ORM\Column(type="string", length=50, nullable=false)
     */
    private string $type;

    /**
     * @var int
     * @ORM\Column(type="integer", nullable=false)
     */
    private int $user;
}

Y hay dos tipos de usuarios: Admins y Clients. Hay una relación ManyToMany entre Group y User. Y la propiedad $type de GroupUser guarda la Clase de Admin o Client, y la propiedad $user guarda el ID.

id group_id user type
1 1 1 Entity\Admin
2 2 1 Entity\Client

¿Cómo puedo hacer la conexión usando Doctrine desde el lado de Admin y Cliente? ¿O quizás alguien podría indicarme algunos recursos sobre cómo funciona este tipo de relación en Doctrine? Tengo dificultades para encontrar información al respecto. Imagino que podría ser algo como un leftJoin condicional, pero no logro resolverlo.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para unir la tabla GroupUser utilizando Doctrine desde el lado del Administrador y del Cliente, puedes utilizar el siguiente código:

    Para los Administradores:

    $admins = $entityManager->createQueryBuilder()
        ->select('gu')
        ->from('GroupUser', 'gu')
        ->leftJoin('gu.group', 'g')
        ->where('gu.user = :id')
        ->andWhere('gu.type = :type')
        ->setParameter('id', $adminId)
        ->setParameter('type', 'Entity\Admin')
        ->getQuery()
        ->getResult();
    

    Para los Clientes:

    $clients = $entityManager->createQueryBuilder()
        ->select('gu')
        ->from('GroupUser', 'gu')
        ->leftJoin('gu.group', 'g')
        ->where('gu.user = :id')
        ->andWhere('gu.type = :type')
        ->setParameter('id', $clientId)
        ->setParameter('type', 'Entity\Client')
        ->getQuery()
        ->getResult();
    

    Aquí, estamos utilizando la función leftJoin para unir la tabla GroupUser con la tabla Group. También estamos utilizando condiciones where para filtrar los resultados basados en el usuario y el tipo.

    Puedes consultar los siguientes recursos para entender más acerca de las relaciones ManyToMany en Doctrine:

Comments are closed.