Методы, чтобы проверить, если существует связь, в использует Doctrine2
Я не могу найти никакого упоминания в документации по доктрине о том, как проверить, имеет ли сущность существующее отношение к другой сущности:
http://www.doctrine-project.org/docs/orm/2.0/en/reference/working-with-associations.html
В Учении 1.x был метод под названием exists
это может быть вызвано для проверки сущности это:
в доктрине 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
надеюсь, это будет полезно!