2012-02-03 6 views
7

estados Documentación:Cómo especificar varias condiciones de combinación de relación 1: 1 en Doctrina 2

class Cart 
{ 
    // ... 

    /** 
    * @OneToOne(targetEntity="Customer", inversedBy="cart") 
    * @JoinColumn(name="customer_id", referencedColumnName="id") 
    */ 
    private $customer; 

    // ... 
} 

Esta anotación representa como SQL:

JOIN Customer c ON c.id = cart.customer_id 

Y el problema es que tengo que añadir adicional comparación allí, como:

JOIN Customer c ON c.id = cart.customer_id AND c.anotherField = <constant> 

¿Alguna solución para eso?

UPD:

la verdadera condición adicional que necesito por ahora es <const> BETWEEN c.f1 AND c.f2

+0

¿Ha tratado de especificar segundo unirse a la columna con 'columnDefinition =" enum ('YOUR_CONSTANT') ")'? – jkucharovic

+0

Puede usar queryBuilder al hacer la consulta? – CappY

+0

En realidad, la segunda condición es un poco más difícil, pensé que no importa la solución * general *. Por ahora necesito 'AND ENTRE c.f1 Y c.f2' – zerkms

Respuesta

0

puede utilizar la palabra clave WITH adicional para especificar condiciones de combinación, como se puede ver en algunos de los examples.

creo que esto debería conseguir que va:

SELECT l, c FROM location 
INNER JOIN Customer c 
WITH CURRENT_TIMESTAMP() BETWEEN c.f1 AND c.f2 
WHERE CURRENT_TIMESTAMP() BETWEEN l.f1 AND l.f2 

me quita la cláusula ON porque creo que no hay necesidad de especificar explícitamente la ON campos de unirse a menos que no son los "normales" (id de cada entidad)

también noten la llamada a CURRENT_TIMESTAMP() que se traduce en MySQL's NOW(). echa un vistazo a una lista de otras funciones agregadas bastante útiles y expresiones here

+2

Realmente no responde la pregunta. Digamos que solo quería registros activos, ¿puede expresar eso con la notación? O explique cómo usar ese blob de DQL para poblar la propiedad de una entidad. – ficuscr

0

No parece haber ninguna solución a su problema que Doctrine pueda hacer de forma automática.

Dado que @ficuscr ya le dio una solución para las consultas, solo hay una cosa más que controlar: verifique su criterio adicional y regrese la instancia Cliente en su getter en caso de éxito y NULL en caso de no cumplir los criterios adicionales.

class Cart 
{ 
    const VALUE = '<some_constant_value>'; 
    /** 
    * @OneToOne(targetEntity="Customer", inversedBy="cart") 
    * @JoinColumn(name="customer_id", referencedColumnName="id") 
    */ 
    private $customer; 

    // ... 

    /** 
    * @return Customer|null 
    */ 
    public function getCustomer() 
    { 
     if ($this->customer->getField1() <= self::VALUE 
      && $this->customer->getField2() >= self::VALUE 
     ) { 
      return $this->customer; 
     } 

     return null; 
    } 
} 

Si esto era un uno-a-muchos relación, Collection Filtering API (aka Criterios) podría ser utilizado para filtrar la colección creada por las asignaciones:

use Doctrine\Common\Collections\Criteria; 

class Cart 
{ 
    const VALUE = '<some_constant_value>'; 
    /** 
    * @OneToMany(targetEntity="Customer", mappedBy="cart") 
    */ 
    private $customers; 

    // ... 

    /** 
    * @return Customer[]|ArrayCollection 
    */ 
    public function getCustomers() 
    { 
     $expr = Criteria::expr(); 
     $criteria = Criteria::create() 
      ->where($expr->andX(
       $expr->lte('field1', self::VALUE), 
       $expr->gte('field2', self::VALUE) 
      )); 

     return $this->patientProblems->matching($criteria); 
    } 
} 
Cuestiones relacionadas