Методы проверки наличия отношений в Doctrine2

Я не могу найти упоминания в документации Doctrine о том, как проверить, имеет ли сущность существующее отношение к другому объекту:

http://www.doctrine-project.org/docs/orm/2.0/en/reference/working-with-associations.html

В Doctrine 1.x появился метод под названием exists, который можно было бы вызвать в сущности, чтобы проверить это:

http://www.doctrine-project.org/documentation/manual/1_2/en/working-with-models#dealing-with-relations:clearing-related-records

В Doctrine 2.0 это то, что я обычно делал. Какие методы используются другими людьми?

<?php

class Group    {
    private $id;
    protected $name;
    protected $users;

    public function __construct()
    {
        $this->colorgroups = new ArrayCollection();
    }

    public function hasUsers() {
        return count($this->users) > 0;
    } 
}

Ответ 1

Ну, я действительно наткнулся на правильный ответ сегодня, глядя на класс ArrayCollection. Вы должны использовать метод isEmpty.

Из кода (комментарии принадлежат им, а не мои)

/**
 * Checks whether the collection is empty.
 * 
 * Note: This is preferrable over count() == 0.
 *
 * @return boolean TRUE if the collection is empty, FALSE otherwise.
 */
public function isEmpty()
{
    return ! $this->_elements;
}

Итак, из моего примера

public function hasUsers() {
        return !$this->users->isEmpty();
} 

Ответ 2

Doctrine2 использует другую архитектуру, чем Doctrine1.2. Если вы хотите проверить, связан ли с ней определенный пользователь, вам следует написать метод hasUser(User $user), который определит его:

public function hasUser(User $user) {
    foreach ($this->users as $u) {
        if ($u->equals($user)) {
            return true;
        }
    }

    return false;
}

Если вы хотите проверить, сохраняется ли связь в базе данных, вам необходимо выполнить следующий запрос DQL:

SELECT 1 FROM MyProject\Entity\Group g WHERE :user MEMBER OF g.users;

Где :user объект User.

Ответ 4

В качестве альтернативы вы можете использовать обработку исключений

try {

$entity = $entity->getAnotherEntity() ; // OneToOne Mapping 

}catch(\Exception $e) {

$entity = null ;

}

P.S Более конкретное исключение можно использовать, чтобы сделать его еще лучше.