我需要从教义中的多对多关系中得到一个过滤结果。
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;
}
过滤集合,请使用 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);
});
它将过滤集合并返回包含所需结果的新集合
您的问题是公司加载缓慢,不受任何限制的影响。 无论如何,$user->getCompanies()
将始终归还所有公司。
您需要 a) 使用 QueryBuilder 和 b) 从筛选的结果集中冻结实体。
例如
$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();
这将获取 id 为 1 的所有用户(即一个用户),并且只会获取 id 匹配为 1 的公司。
如果你愿意,你可以使用 getOneOrNullResult() 而不是 getResult 来获取单个用户。
使用查询构建器,您可以使用如下内容:
$s_program = $qb->getQuery()->setMaxResults(1)->getOneOrNullResult();
在您的情况下,请尝试以下替代:
$user = $entityManager->getRepository('Users')->setMaxResults(1)->getOneOrNullResult();
我不知道它是否有效,但请尝试一下!