【问题标题】:Doctrine many to many query builder教义多对多查询生成器
【发布时间】:2015-01-31 18:18:16
【问题描述】:

我有一个Contacts 实体和一个具有多对多 关系的Users 实体,以便设置最喜欢的联系人。

我尝试构建一个查询来查找联系人是否是用户的最爱。教义返回以下错误:

[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;

【问题讨论】:

    标签: symfony doctrine-orm many-to-many dql


    【解决方案1】:

    首先,您需要将 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();
    }
    

    希望对你有帮助

    【讨论】:

    • 感谢您的帮助。为什么要指定 JoinTable 名称?教义是自动创建的吗?您的意思是查询对象仅适用于一对一或一对多关系?
    • 可能是这种情况,因为如果我这样做->andWhere('f.id = :user'),那么它就可以工作。唯一的区别是我使用 id 而不是对象本身...
    • 当我尝试你的建议时,它会触发以下错误:Class 'Curuba\contactsBundle\Entity\contacts_users' is not defined.。当我尝试使用contactsBundle:contacts_users 时,它也不起作用。我需要自己创建类来描述多对多关系吗?
    【解决方案2】:

    我最终创建了自己的课程。这也是在使用此捆绑包时获得更大灵活性来操作查询所必需的: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;
    
    }
    

    【讨论】:

      猜你喜欢
      • 2015-05-30
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多