Doctrine - ManytoMany过滤结果

时间:2016-05-25 03:15:45

标签: php symfony doctrine-orm doctrine

我需要从学说中的多对多关系中获得过滤结果。

Class Users extends RecordItem {
    /**
    * @Id @Column(type="integer") @GeneratedValue
    * @var int
    **/

    protected $id;
     /**
     * @ManyToMany(targetEntity="Company")
     * @JoinTable(name="users_join_company",
     *      joinColumns={@JoinColumn(name="user_id", referencedColumnName="id")},
     *      inverseJoinColumns={@JoinColumn(name="company_id", referencedColumnName="id")}
     *      )
     */
    protected $companys;

    /**
    * @Column(type="string", length=100)
    * @var string
    */
    protected $username;   
    //edit - > added array collection - forgotten
    public function __construct() {
        $this->companys = new ArrayCollection();
    }
}

Class Company extends Recorditem {

    /**
    * @Id @Column(type="integer") @GeneratedValue
    * @var int
    **/
    protected $id;

    /**
    * @Column(type="string", length=100)
    * @var string
    */
    protected $company_name;  
}

到目前为止,我只能从以下代码查询所有公司,是否有正确的方法来添加过滤器?例如:数组集合中有3家公司,想要返回一个指定公司" id"

$user = $entityManager->getRepository('Users')->findOneBy(['id'=>1]);

$companys = $user->companys; // hope to return only company with the id 1

foreach($companys as $company){
    echo $company->company_name;
}

3 个答案:

答案 0 :(得分:2)

如果要过滤集合,请使用ArrayCollection ...

http://doctrine-orm.readthedocs.io/projects/doctrine-orm/en/latest/reference/working-with-associations.html

示例:

// I guess companies is an ArrayCollection
$myDesiredCompanies = $companies->filter(function (Company $entry) {
    return ($entry->getId() == 1);
});

它将过滤集合并返回带有所需结果的新集合

答案 1 :(得分:1)

你的问题是公司是懒惰的,不受任何限制的影响。 $user->getCompanies()无论如何都将永远归还所有公司。

您需要a)使用QueryBuilder和b)从过滤后的结果集中保存您的实体。

E.g。

$qb = $this->getEntityManager()->createQueryBuilder();
$users = $qb->select('u', 'c') // important - select all entities in query to avoid lazy loading which ignores query constraints
  ->from('YourBundle:Users', 'u')
  ->join('u.companys', 'c')
  ->where('u.id = :userId')
  ->andWhere('c.id = :companyId')
  ->setParameter('userId', 1)
  ->setParameter('companyId', 1)
  ->getQuery()
  ->getResult();

这将为您提供身份1的所有用户(一个用户),并且只会获取ID为1的公司。

如果您需要,可以使用getOneOrNullResult()而不是getResult来获取单个用户。

答案 2 :(得分:0)

使用查询构建器,您可以使用以下内容:

$s_program = $qb->getQuery()->setMaxResults(1)->getOneOrNullResult();

在你的情况下尝试这个替代品:

$user = $entityManager->getRepository('Users')->setMaxResults(1)->getOneOrNullResult();

我不知道它是否会起作用,但要试一试!