Методы проверки наличия отношений в 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
.
Ответ 3
Вы можете использовать метод 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
Ответ 4
В качестве альтернативы вы можете использовать обработку исключений
try {
$entity = $entity->getAnotherEntity() ; // OneToOne Mapping
}catch(\Exception $e) {
$entity = null ;
}
P.S Более конкретное исключение можно использовать, чтобы сделать его еще лучше.
Ответ 5
Я знаю, что это старый вопрос, но он может быть полезен кому-то другому или, возможно, даже вам.
Я думаю, что вы искали метод relatedExists()
, который вы можете найти здесь:
http://docs.doctrine-project.org/projects/doctrine1/en/latest/en/manual/working-with-models.html#clearing-related-records
Надеюсь, это будет полезно!