Методы, чтобы проверить, существуют ли отношения в Doctrine2 - PullRequest
11 голосов
/ 03 июня 2011

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

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

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

http://www.doctrine -project.org / документация / manual / 1_2 / ru / работа с моделями # работа с отношениями: очистка связанных записей

InДоктрина 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 ]

8 голосов
/ 14 августа 2011

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

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 объект.

5 голосов
/ 09 августа 2011

Вы можете использовать метод Exists http://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
0 голосов
/ 12 апреля 2017

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

try {

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

}catch(\Exception $e) {

$entity = null ;

}

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

0 голосов
/ 30 марта 2013

Я знаю, что это старый вопрос, но он может быть полезен кому-то еще, а может, даже вам.Я думаю, что вы искали метод relatedExists(), который вы можете найти здесь: http://docs.doctrine -project.org / projects / doctrine1 / en / latest / en / manual / working-with-models.html #клиринговые записи

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

...