Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

PHP OO Intentando entender DQL

Estas en el tema de Intentando entender DQL en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Buenas, Pues eso, que por más que hago pruebas, modifico la consulta, y busco ejemplos, no temino de encontrarle lógica al funcionamiento de las consultas ...
  #1 (permalink)  
Antiguo 25/09/2011, 11:51
Avatar de Uncontroled_Duck
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Málaga [Spain]
Mensajes: 806
Antigüedad: 13 años, 6 meses
Puntos: 261
Intentando entender DQL

Buenas,

Pues eso, que por más que hago pruebas, modifico la consulta, y busco ejemplos, no temino de encontrarle lógica al funcionamiento de las consultas DQL en Doctrine2.

En el caso básico vale, más o menos veo como va estructurada, y no resulta complicado entenderla.
Código PHP:
Ver original
  1. $dql = "SELECT u FROM Entity\Users u";
  2. $query = $em->createQuery($dql);
  3. $users = $query->getResult();

Pero si añadimos algún Join, o queremos hacerla más compleja y que tome datos de varios Entities, y solo ciertos campos, con los ejemplos que hay en la documentación no te lo deja muy claro.

Este es uno de los ejemplos de la doc oficial. Pero aquí no hay especificados Entities, y no queda muy claro por ejemplo "a", es alias de que? Está ahí como en tierra de nadie.
Código PHP:
Ver original
  1. $dql = "SELECT u, a FROM Users u JOIN u.address a WHERE a.city = 'Berlin'";
  2. $query = $em->createQuery($dql);
  3. $users = $query->getResult();

Si esta misma consulta la quiero tomar de datos de dos Entities, y solo ciertos campos. Viendo los ejemplos y utilizando la teoría SQL sería una cosa así?
Código PHP:
Ver original
  1. // OneToMany City Users
  2. $dql = "SELECT c.name, u.name FROM Entity\City c
  3.        JOIN Entity\Users u WHERE c.cityId = u.cityId";
Alguien puede aclararme un poco como se estructuran. Ahora mismo ando bastante perdido y siempre me da errores de sintaxis cuando intento hacer un JOIN. Como he dicho antes, por mas que lo intento no le encuentro la lógica para construirla correctamente.

Gracias de antemano. Saludos,
__________________
Todos agradeceremos que pongas el código en su respectivo Highlight
  #2 (permalink)  
Antiguo 25/09/2011, 12:09
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 10 meses
Puntos: 845
Respuesta: Intentando entender DQL

Cita:
Pero aquí no hay especificados Entities, y no queda muy claro por ejemplo "a", es alias de que?
En el ejemplo es el alias de address.

Postea las entities y el DQL que te da el error y ten en cuenta que cuando haces un join no tienes que relacionar las claves como si fuera SQL, eso es transparente para vos, en todo caso seria algo asi:

Código PHP:
Ver original
  1. $dql = "SELECT c.name, u.name FROM Entity\City c JOIN Entity\Users u ";

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #3 (permalink)  
Antiguo 26/09/2011, 01:15
Avatar de Uncontroled_Duck
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Málaga [Spain]
Mensajes: 806
Antigüedad: 13 años, 6 meses
Puntos: 261
Respuesta: Intentando entender DQL

Hola masterpuppet,

Entendido lo de el alias de "a"

Abajo dejo los Entities y la consulta que estoy probando:

Si pongo el "AS" antes de el alias del Entity me da el error:
Código:
1) Entities\Entity\ElementsTest::test_SelectElementsDelegations
Undefined index: Entities\Entity\Users
Y si pongo la consulta sin el "AS" para los alias me da el error:
Código:
1) Entities\Entity\ElementsTest::test_SelectElementsDelegations
Doctrine\ORM\Query\QueryException: [Syntax Error] line 0, col 89: 
Error: Expected Doctrine\ORM\Query\Lexer::T_DOT, got 'u'
Hasta que no trabaje un poco con las consultas (si consigo que funcionen), los errores me suenan a chino, en fin... poco a poco.

La consulta:
Código PHP:
public function test_SelectElementsDelegations()
{
    
$em $this->doctrineContainer->getEntityManager();
    
$dql 'SELECT d.name, u.firstName '
          
.'FROM Entities\Entity\Delegations AS d '
          
.'JOIN Entities\Entity\Users AS u';
    
$query $em->createQuery($dql);
    
$element $query->getResult();

    foreach( 
$element as $key => $value )
    {
        echo 
$element[$key]['name'] . ' ' $element[$key]['firstName'] . "\n";
    }

El Entity Delegations
Código PHP:
declare(ENCODING 'utf-8');
//Lo pongo comentado por que no salen las barras invertidas
namespace /*Entities\Entity*/;

/**
 * @Entity(repositoryClass="Entities\Entity\Repository\DelegationsRepository")
 * @Table(name="data_delegations")
 */
class Delegations
{
    
/**
     * @Column(name="del_id", type="integer", length=11, nullable=false)
     * @Id
     * @GeneratedValue(strategy="IDENTITY")
     */
    
private $id;

    
/**
     * @Column(name="del_name", type="string", length=255, nullable=false)
     */
    
private $name;

    
/**
     * 
     * @param \Doctrine\Common\Collections\Collection $users
     * 
     * @OneToMany(targetEntity="Users",mappedBy="delegations", cascade={"persist","remove"})
     */
    
private $users;

    
/** 
     *
     */
    
public function __get($property)
    {
        return 
$this->$property;
    }
    
    public function 
__set($property$value)
    {
        
$this->$property $value;
    }

El Entity Users
Código PHP:
declare(ENCODING 'utf-8');
//Lo pongo comentado por que no salen las barras invertidas
namespace /*Entities\Entity*/;

/**
 * @Entity(repositoryClass="Entities\Entity\Repository\UsersRepository")
 * @Table(name="data_users")
 */
class Users
{
    
/**
     * @Column(name="use_id", type="integer", length=11, nullable=false)
     * @Id
     * @GeneratedValue(strategy="IDENTITY")
     */
    
private $id;

    
/**
     * @Column(name="del_id", type="integer", length=11, nullable=false)
     */
    
private $delId;

    
/**
     * @Column(name="use_first_name", type="string", length=100, nullable=false)
     */
    
private $firstName;

    
/**
     * @var Delegations
     * 
     * @ManyToOne(targetEntity="Delegations")
     * @JoinColumns({
     *     @JoinColumn(name="del_id", referencedColumnName="del_id")
     * })
     */
    
private $delegations;

    
/** 
     *
     */
    
public function __get($property)
    {
        return 
$this->$property;
    }
    
    public function 
__set($property$value)
    {
        
$this->$property $value;
    }

Gracias por todo, un saludo.
__________________
Todos agradeceremos que pongas el código en su respectivo Highlight
  #4 (permalink)  
Antiguo 26/09/2011, 02:21
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 10 meses
Puntos: 845
Respuesta: Intentando entender DQL

El as no es necesario y el DQL creo que seria algo así:

Código PHP:
Ver original
  1. $dql = 'SELECT d.name, u.firstName '
  2.      . 'FROM Entities\Entity\Delegations d '
  3.      . 'JOIN d.users u';

Te hago una sugerencia, si las entidades representan la unidad no deberías nombrarlas en plurar, Delegations debería ser Delegation, Users - User y bueno los mensajes de error lejos están de ser amigables, yo creo que ni ellos los entienden .

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #5 (permalink)  
Antiguo 26/09/2011, 02:55
Avatar de Uncontroled_Duck
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Málaga [Spain]
Mensajes: 806
Antigüedad: 13 años, 6 meses
Puntos: 261
Respuesta: Intentando entender DQL

Ahora si !!

Vale, la parte que no entendía es como hacía el JOIN, que es a través de la propiedad del Entity asociado. Esto si tiene lógica.

Y en el caso de ser un ManyToMany, supuestamente es igual, haces el JOIN a través de la propiedad y accedes al Entity asociado no? Voy a hacer más pruebas.

Sobre los nombres de los entities, lo tengo en plural por el planteamiento mio(quizás erroneo) contrario al que comentas. Al acceder a todos los datos de la DB lo pongo en plural. Así en un vistazo, en los Controller's y los View's, se si la variable contiene datos del Entity (plural), o si estas tratando datos recibidos de un form u otro sitio (singular).

Todavía estoy a tiempo de realizar cambios, así que puedo adaptarme a esas sugerencias que seguro estarán bien fundamentadas.

masterpuppet, gracias de nuevo.

Un saludo,
__________________
Todos agradeceremos que pongas el código en su respectivo Highlight
  #6 (permalink)  
Antiguo 26/09/2011, 03:35
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 10 meses
Puntos: 845
Respuesta: Intentando entender DQL

Cita:
Y en el caso de ser un ManyToMany, supuestamente es igual, haces el JOIN a través de la propiedad y accedes al Entity asociado no?
Si es igual, para nosotros es transparente , lo que tienes que tener en cuenta en @ManyToMany es que las asociaciones no siempre son obligatorias y por lo tanto debes utilizar LEFT JOIN.

Cita:
Sobre los nombres de los entities, lo tengo en plural por el planteamiento mio(quizás erroneo) contrario al que comentas. Al acceder a todos los datos de la DB lo pongo en plural. Así en un vistazo, en los Controller's y los View's, se si la variable contiene datos del Entity (plural), o si estas tratando datos recibidos de un form u otro sitio (singular).
Quien accede a los datos es el repositorio, el cual si maneja la colección, por lo tanto se lo define en plural, pero la entidad no, representa la unidad, no te parece raro hacer new Delegations o new Users y que en realidad sea solamente una delegación o usuario ?, el plurar deberia ser para las colecciones, esto aplica tambien a las propiedades, Delegation::$users es correcto por ejemplo.

Esto no es mas que una sugerencia, si tu lo ves mas claro como lo tienes, no me hagas ni caso.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #7 (permalink)  
Antiguo 26/09/2011, 03:59
Avatar de Uncontroled_Duck
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Málaga [Spain]
Mensajes: 806
Antigüedad: 13 años, 6 meses
Puntos: 261
Respuesta: Intentando entender DQL

Tienes toda la razón, ese planteamiento resulta más comprensible y lógico.

Voy a hacer los cambios oportunos.

Muchas gracias, un saludo.
__________________
Todos agradeceremos que pongas el código en su respectivo Highlight

Última edición por Uncontroled_Duck; 28/09/2011 a las 09:44

Etiquetas: entender
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:20.