2011-06-03 13 views
10

Me parece que no puede encontrar ninguna mención en la documentación Doctrina sobre cómo comprobar si una entidad tiene una relación existente con otra entidad:Técnicas para comprobar si existe relación en la Doctrine2

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

En Doctrina 1.x había un método llamado exists que se podría llamar a una entidad para comprobar esto:

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

en Doctrina 2.0 esto es lo que he tendido a hacer. ¿Qué técnicas usan otras personas?

<?php 

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

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

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

1 para el nombre del perfil alusiva :) – Bastardo

+3

amor que el comentario de alguien que optó por ir por @Bastardo -.- – Rixius

Respuesta

8

Bueno - De hecho, me encontré con la respuesta correcta hoy mientras mira a pesar de la clase ArrayCollection. Debe usar el método 'isEmpty'.

A partir del código (los comentarios son de ellos, no mío)

/** 
* 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; 
} 

Así que desde mi ejemplo

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

Doctrine2 utiliza una arquitectura diferente a la de Doctrine1.2. Si desea comprobar si un grupo tiene un determinado usuario asociado a él se debe escribir un método hasUser(User $user) que determinará que:

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

    return false; 
} 

Si desea comprobar si una relación es persistido en la base de datos que tendrá que ejecutar una consulta DQL la siguiente:

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

Dónde :user es User objeto.

+0

Esto parece mucho más detallado de lo que mi propio método (1 línea vs 6 líneas). ¿Su método ofrece alguna ventaja sobre la mía? Gracias por la respuesta. – calumbrodie

+0

Súper pedante pero HQL! = DQL – calumbrodie

+0

Ops ... Lo hice por costumbre. ;) Reparado. Sobre la ventaja ... no hay ninguna. No hay una solución más corta para verificar si un objeto pertenece a la colección (opcionalmente podría usar [ArrayCollection :: contains()] (http://www.doctrine-project.org/api/common/2.0/doctrine/common/ collections/arraycollection.html # contains()) que realmente hacen cosas bastante similares.Tus 'hasUsers()' hacen algo más y, por cierto, deberían incluirse justo antes de mi método en la aplicación del mundo real. – Crozin

5

Puede USE existe método http://www.doctrine-project.org/api/common/2.4/class-Doctrine.Common.Collections.ArrayCollection.html#_exists algo como esto

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

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

Bueno, aunque sería necesario tener cuidado con el consumo de memoria sobre el uso de cierres dentro de las entidades. http://www.php.net/manual/en/function.create-function.php#70691 – calumbrodie

+0

no, tendrías que tener cuidado con tu memoria: D dijiste "Me interesaba ver diferentes enfoques" este yo uno ... en mi opción esta solución es la mejor, creo que SELECCIONA 1 DE MyProject \ Entity \ Group g WHERE: usuario MIEMBRO DE g.users; – PayteR

+0

Aprecio la entrada, siempre es bueno ver otras alternativas. También me alentó a que revisara la clase de consulta más a fondo, lo que incluye todo tipo de cosas que son útiles pero no están completamente documentadas. ¡Gracias! – calumbrodie

-1

Alternativamente, puede utilizar manejo de excepciones

try { 

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

}catch(\Exception $e) { 

$entity = null ; 

} 

P.S más específica de excepción se puede utilizar para que sea aún mejor.

+0

¿Está seguro de que el mapeo O-O en Doctrine arrojaría una excepción si no hay una entidad vinculada? Supongamos que hubiera nulo. –