我需要从学说中的多对多关系中获得过滤结果。
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;
}
答案 0 :(得分:2)
如果要过滤集合,请使用ArrayCollection ...
示例:
// 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();
我不知道它是否会起作用,但要试一试!