Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to convert Doctrine object into json

I am using Doctrine 1.2, how could I get the query object into json / array format?

$user = Doctrine_Query::create()
->select('u.id, u.username, u.firstname, u.lastname')
->from('User u')
->orderby('u.id')
->execute();
like image 835
cc96ai Avatar asked Dec 19 '09 23:12

cc96ai


4 Answers

A solution might be to use the toArray() method on the $user object, to have a simple array containing only the data youre interested in, and, then, use json_encode to convert that PHP array to a JSON string.

Something like this, I suppose :

$user = Doctrine_Query::create()
->select('u.id, u.username, u.firstname, u.lastname')
->from('User u')
->orderby('u.id')
->execute();

$userArray = $user->toArray();
$json = json_encode($userArray);

(Not tested, but it should not be too far from working...)

like image 78
Pascal MARTIN Avatar answered Nov 10 '22 16:11

Pascal MARTIN


Trouble with $record->exportTo('json') is that it will export all record fields. And in most cases it's not a desirable behaviour (for e.g. when this piece of json should be passed to browser). One way to limit the scope of export is to specify fields in DQL select:

$user = Doctrine_Query::create()
            ->select('u.id, u.name')
            ->from('User u')
            ->addWhere('u.id = ?', $id)
            ->fetchOne();

$user_json = $user->exportTo('json');

$user_json then will have something like this:

{
    "id": 123,
    "name": "John Smith",
    "password": null,
    "deleted": null
}

So it does not expose "password" field value but does expose underlying database structure. Again, might not be what we want. What I do is specify fields in DQL select + fetch as array then json encode:

$user = Doctrine_Query::create()
            ->select('u.id, u.name')
            ->from('User u')
            ->addWhere('u.id = ?', $id)
            ->fetchOne(array(), Doctrine::HYDRATE_ARRAY);

$user_json = json_encode($user);

In this case json will look like something like:

{
  "id": 123,
  "name": "John Smith"
}
like image 37
Tadas Sasnauskas Avatar answered Nov 10 '22 16:11

Tadas Sasnauskas


$users2 = Doctrine_Query::create()
->select('u.id, u.username, u.firstname, u.lastname')
->from('User u')
->orderby('u.id');
$tmp2 = $users2->fetchArray();

I don't know why the toArray() will give the other field in the table, e.g. it will have the "password" field, it seems fetchArray() can give me the correct fields in query.

toArray()

Array
(
    [0] => Array
        (
            [id] => 1
            [username] => user1
            [password] => password
            [firstname] => John
            [lastname] => Smith
        )

fetchArray()

Array
(
    [0] => Array
        (
            [id] => 1
            [username] => user1
            [firstname] => John
            [lastname] => Smith
        )
like image 1
cc96ai Avatar answered Nov 10 '22 14:11

cc96ai


For JSON :

$user->exportTo('json');

;-)

like image 1
inalgnu Avatar answered Nov 10 '22 15:11

inalgnu