ArrayCollection ::与关系匹配

时间:2013-07-25 23:32:23

标签: php symfony doctrine-orm

我有三个doctrine2模型:

Person
 - $id
 - $schoolClasses (ArrayCollection, OneToMany PersonSchoolClass)

SchoolClass
 - $id

PersonSchoolClass (ManyToOne SchoolClass)
 - $id
 - $schoolClass
 - $person
 - $active

在我的Person::addSchoolClass(SchoolClass $schoolClass)中,我想知道,SchoolClass中是否已有ArrayCollection<PersonSchoolClass>

我使用此代码:

/**
 * @param SchoolClass $schoolClass
 * @return Person
 */
public function addSchoolClass(SchoolClass $schoolClass)
{
    $criteria = Criteria::create()
        ->where(Criteria::expr()->eq("schoolClass.id", $schoolClass->getId()))
        ->setFirstResult(0)
        ->setMaxResults(1);

    $t = $this->getSchoolClasses()->matching($criteria);

    if (!$t) {
        $t = new PersonSchoolClass();
        $t->setPerson($this);
        $t->setSchoolClass($schoolClass);
        $this->getSchoolClasses()->add($schoolClass);
    }

    $t->setActive();

    return $this;
}

但是我总是在$this->getSchoolClasses()->matching($criteria);处于超时状态(一分钟左右后进程被杀死)。

有没有人有想法?

非常感谢!

2 个答案:

答案 0 :(得分:1)

ArrayCollection有方法contains,用于检查该实体是否已收集。

if (!$this->getSchoolClasses()->contains($schoolClass)) {
    ...
}

答案 1 :(得分:0)

我很确定你已经找到了你的问题的答案,但是对于其他任何搜索它的人来说,可以用Criteria搜索Doctrine2中的ArrayCollection,Criteria也是Doctrine2的一部分,就像DQL一样,这个页面包含所需的所有信息:

http://doctrine-orm.readthedocs.org/en/latest/reference/working-with-associations.html#filtering-collections