Методы, чтобы проверить, если существует связь, в использует Doctrine2

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

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

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

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

в доктрине 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;
    } 
}

5 ответов


Ну-я на самом деле наткнулся на правильный ответ сегодня, глядя на класс 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();
} 

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 is


вы можете использовать метод Existshttp://www.doctrine-project.org/api/common/2.4/class-Doctrine.Common.Collections.ArrayCollection.html#_exists что-то вроде этого

$someId = 123;
$p = function($key, $element) use ($someId){
     return $element->getId() == $someId;
};

$u->exists($p); //here is your result

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

try {

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

}catch(\Exception $e) {

$entity = null ;

}

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


relatedExists() способ, что вы можете найти здесь: http://docs.doctrine-project.org/projects/doctrine1/en/latest/en/manual/working-with-models.html#clearing-related-records

надеюсь, это будет полезно!