Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Select One column Doctrine DQL

I need a simple column for a table.

By example a table "project", with column id, name and year.

If I do:

$q = Doctrine_Query::create()
        ->select('a.pro_id')
        ->from('fndr_proyecto a')
        ->where('a.pro_id =?',1);
    $pro = $q->execute();
    json_encode($pro->toArray());

The answer is all column like

{"id":1,"name":"Project name","year":2013}

but I need only one column. I expect:

{"id":1}

It is with DQL because with native SQL work fine.

The ORM is build automaticaly with a Visual Paradigm.

like image 379
h3g0r_ Avatar asked Jan 19 '13 04:01

h3g0r_


People also ask

What is Doctrine query?

Doctrine Query Language (DQL) is an Object Query Language created for helping users in complex object retrieval. You should always consider using DQL (or raw SQL) when retrieving relational data efficiently (eg. when fetching users and their phonenumbers).

What is hydration in doctrine?

What is hydration? Doctrine ORM, like most ORMs, is performing a process called Hydration when converting database results into objects. This process usually involves reading a record from a database result and then converting the column values into an object's properties.


2 Answers

This is because Doctrine hydrate the response with all the object information, so all columns.

You need to use a different hydration method, there are many one, but let's focus on 5 of them:

  • HYDRATE_RECORD, the default one
  • HYDRATE_ARRAY
  • HYDRATE_NONE
  • HYDRATE_SCALAR
  • HYDRATE_ARRAY_SHALLOW

You need the HYDRATE_ARRAY_SHALLOW hydration method. Here's why.

  1. HYDRATE_RECORD

    $q = Doctrine_Query::create()
        ->select('a.pro_id')
        ->from('fndr_proyecto a')
        ->where('a.pro_id = ?',1);
    $pro = $q->execute(array(), Doctrine_Core::HYDRATE_RECORD);
    var_dump(json_encode($pro->toArray()));
    

    This will hydrate the result using object, and also hydrate relations (if you use a leftJoin inside your query). Since it returns object, we need to call toArray() to be able to send a propre json:

    [{"id":1,"name":"Project name","year":2013}]"
    
  2. HYDRATE_ARRAY

    $q = Doctrine_Query::create()
        ->select('a.pro_id')
        ->from('fndr_proyecto a')
        ->where('a.pro_id = ?',1);
    $pro = $q->execute(array(), Doctrine_Core::HYDRATE_ARRAY);
    var_dump(json_encode($pro));
    

    This will hydrate result as an array an automatically add the primary key:

    [{"id":"1","pro_id":"1"}]"
    
  3. HYDRATE_NONE

    $q = Doctrine_Query::create()
        ->select('a.pro_id')
        ->from('fndr_proyecto a')
        ->where('a.pro_id = ?',1);
    $pro = $q->execute(array(), Doctrine_Core::HYDRATE_NONE);
    var_dump(json_encode($pro));
    

    This won't hydrate result, and return just values:

    [["1"]]"
    
  4. HYDRATE_SCALAR

    $q = Doctrine_Query::create()
        ->select('a.pro_id')
        ->from('fndr_proyecto a')
        ->where('a.pro_id = ?',1);
    $pro = $q->execute(array(), Doctrine_Core::HYDRATE_SCALAR);
    var_dump(json_encode($pro));
    

    This will hydrate result from the select but with key index as the column name with the table alias:

    [{"a_pro_id":"1"}]"
    
  5. HYDRATE_ARRAY_SHALLOW

    $q = Doctrine_Query::create()
        ->select('a.pro_id')
        ->from('fndr_proyecto a')
        ->where('a.pro_id = ?',1);
    $pro = $q->execute(array(), Doctrine_Core::HYDRATE_ARRAY_SHALLOW);
    var_dump(json_encode($pro));
    

    This will hydrate result from the select but with key index as the column name without the table alias:

    "[{"pro_id":"1"}]"
    
like image 57
j0k Avatar answered Sep 19 '22 12:09

j0k


I'm not sure what version of Doctrine j0k was using. It provided some answers, but I did have trouble finding Doctrine_Query and Doctrine_Core classes. I am using Doctrine 2.3.4. The following worked for me.

public static function getAllEventIDs($em) {
    return parent::getAllFromColumn('\path\to\Entity\entityName', 'id', $em);
}

public static function getAllFromColumn($tableName, $columnName, $em) {
    $q = $em->createQueryBuilder('t')
    ->select("t.$columnName")
    ->from($tableName, 't');

    $q = $q->getQuery();

    $result = $q->getResult(\Doctrine\ORM\Query::HYDRATE_SCALAR);

    return $result;
}

This did however return a array of arrays. ie, the id of the first event was is

$result[0]['id'];
like image 36
Julien Lamarche Avatar answered Sep 21 '22 12:09

Julien Lamarche