2013-07-25 2 views
2

У меня есть три doctrine2 модели:ArrayCollection :: соответствие с отношениями

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

SchoolClass 
- $id 

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

В моих Person::addSchoolClass(SchoolClass $schoolClass), я хочу увидеть, если есть уже в моем ArrayCollection<PersonSchoolClass>SchoolClass.

Я использую этот код:

/** 
* @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); (процесс убит через минуту или около того).

У кого-нибудь есть идеи?

спасибо!

+0

вы пытаетесь проверить, если ваш 'SchoolClass' существует в коллекции уже перед тем, как добавить его? – AlexP

+0

@ALexP Да, точно – Ueli

ответ

1

ArrayCollection имеет метод contains, который проверяет это лицо уже на сбор.

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

+1 Это то, что я собирался сказать – AlexP

+0

Спасибо за ваш ответ. Нет, это не сработает, потому что $ schoolClasses содержит элементы PersonSchoolClass, а не SchoolClass. – Ueli

0

Я уверен, что вы уже нашли ответ на свой вопрос, но для кого-то еще, что ищет для этого, ArrayCollection в Doctrine2 может быть найден с критериями, Критерием является частью Doctrine2, а также и работает только как DQL, эта страница содержит всю необходимую информацию:

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

Смежные вопросы