代码之家  ›  专栏  ›  技术社区  ›  curuba

原则多对多查询生成器

  •  0
  • curuba  · 技术社区  · 9 年前

    我有一个 Contacts 实体和 Users 具有的实体 多对多 关系,以便设置收藏夹联系人。

    我尝试构建一个查询,以查找 联系 是一个 使用者 。Doctrine返回以下错误:

    [Semantical Error] line 0, col 81 near 'favoris = :user': Error: Invalid PathExpression. StateFieldPathExpression or SingleValuedAssociationField expected.
    

    以下是我的疑问:

        public function isFavori(users $user, contacts $contacts) {
    
        $em = $this->getEntityManager();
        $qb = $em->createQueryBuilder('c');
        $query = $qb
            ->select('1')
            ->from('contactsBundle:contacts', 'c')
            ->join('contactsBundle:users', 'f', 'WITH', 'c.favoris = :user')
            ->where('c = :contact')
            ->setParameter('user', $user)
            ->setParameter('contact', $contacts)
        ;
        $querystring = $qb->getQuery();
        return $qb->getQuery()->getResult();
    
    }
    

    以下是 Contact 实体:

    /**
     * @ORM\ManyToMany(targetEntity="Curuba\contactsBundle\Entity\users", inversedBy="contactsfavoris")
     *
     */
    private $favoris;
    
    2 回复  |  直到 3 年前
        1
  •  1
  •   Alexandru Furculita    9 年前

    首先,您需要将JoinTable添加到ManyToManyAssociation:

    /**
     * @ORM\ManyToMany(targetEntity="Curuba\contactsBundle\Entity\users", inversedBy="contactsfavoris")
     * @JoinTable(name="user_contact_favoris")
     */
    private $favoris;
    

    现在您的查询:

    public function isFavori(users $user, contacts $contact) {
    
        $em = $this->getEntityManager();
        $qb = $em->createQueryBuilder('c');
        $qb->select('1')
            ->from('user_contact_favoris', 'f')
            ->innerJoin('contactsBundle:contacts', 'c', 'WITH', 'f.contact = :contact')
            ->innerJoin('contactsBundle:users', 'u', 'WITH', 'f.user = :user')
            ->setParameter('user', $user)
            ->setParameter('contact', $contact)
        ;
    
        return $qb->getQuery()->getResult();
    }
    

    希望有帮助

        2
  •  0
  •   Kamafeather Thalaivar    3 年前

    我最终创建了自己的班级。在使用此捆绑包时,这也是为了获得更大的灵活性来操作查询: APYDataGridBundle .

    以下是我所拥有的:

    contacts 实体类,具有:

    /**
     * @ORM\OneToMany(targetEntity="Curuba\contactsBundle\Entity\contactsfavoris", mappedBy="contact", orphanRemoval=true, cascade={"remove", "persist"})
     * @ORM\JoinColumn(nullable=true)
     */
    private $usersFavoris;
    

    users 实体类,具有:

    /**
     * @ORM\OneToMany(targetEntity="Curuba\contactsBundle\Entity\contactsfavoris", mappedBy="user")
     *
     */
    private $contactsfavoris;
    

    contactsfavoris 实体类,具有:

    /**
     * @ORM\ManyToOne(targetEntity="contacts", inversedBy="usersFavoris")
     */
    private $contact;
    
    /**
     * @ORM\ManyToOne(targetEntity="users", inversedBy="contactsfavoris")
     */
    private $user;
    

    查询:

    public function isFavori(users $user, contacts $contacts) {
    
        $em = $this->getEntityManager();
        $qb = $em->createQueryBuilder('c');
        $userid = $user->getId();
        $contactId = $contacts->getId();
        $query = $qb
            ->select('1')
            ->from('contactsBundle:contactsfavoris','cf')
            ->where('cf.user = :user')
            ->andWhere('cf.contact = :contact')
            ->setParameter('user', $userid)
            ->setParameter('contact', $contacts)
        ;
    
        try {
            $result = $qb->getQuery()->getSingleScalarResult();
        } catch (Exception $e) {
            $result = 0;
        }
        if ($result == 1 ) {
            $favori = true;
        } else {
            $favori = false;
        }
    
        return $favori;
    
    }