2015-01-31 115 views
0

我有一个联系人实体和一个用户实体与多对多的关系来设置收藏夹。学说多对多的查询生成器

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

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

} 

下面是从接触实体加入注释:

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

回答

0

我创造我自己的类结束了。在使用该软件包时,这也是为了更灵活地操作查询所必需的:APYDataGridBundle

因此,这里是我:

contacts.php:

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

users.php:

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

contactsfavoris.php

/** 
* @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; 

} 
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(); 
} 

希望它可以帮助

+0

谢谢你的帮助。我们为什么要指定JoinTable名称?学说自动创建它?你是说查询对象只能用于一对一或一对多的关系吗? – curuba 2015-02-01 08:43:42

+0

可能是这种情况,因为如果我使用'' - >和Where('f.id =:user')''那么它就可以工作。唯一的区别是我使用一个id而不是对象本身... – curuba 2015-02-01 08:48:02

+0

当我尝试你的建议时,它会触发以下错误:'Class'Curuba \ contactsBundle \ Entity \ contacts_users'没有被定义.''。当我用''contactsBundle:contacts_users''尝试时,它也不起作用。 您是否需要实际创建类来描述自己的多对多关系? – curuba 2015-02-01 11:38:41