原则 - 多对多过滤结果



我需要从教义中的多对多关系中得到一个过滤结果。

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

我不知道它是否有效,但请尝试一下!

相关内容

  • 没有找到相关文章