2009-12-19 33 views
11

Estoy utilizando Doctrine 1.2, ¿cómo podría obtener el objeto de consulta en formato json/array?cómo convertir el objeto Doctrine en json

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

Segunda respuesta es muy buena. [http: // stackoverflow.com/preguntas/6706485/How-to-codificar la doctrina-entidades-a-JSON-en-symfony-2-0-ajax-aplicación] [1] [1]: http: // stackoverflow .com/questions/6706485/how-to-encode-doctrine-entities-to-json-in-symfony-2-0-ajax-application – csadan

Respuesta

27

Una solución podría ser utilizar el método toArray() en el objeto $user, para tener una matriz simple que contiene sólo el youre datos interesado, y, a continuación, utilizar json_encode para convertir esa matriz PHP a una cadena JSON.

Algo como esto, supongo:

$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); 

(No se ha probado, pero no debe estar demasiado lejos de trabajo ...)

+1

Así es como lo hago. – Sam

+1

¡Esta respuesta debe marcarse como aceptada! – hossaindoula

+4

¿Esto maneja las relaciones? –

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

No sé por qué el toArray() dará el otro campo en la tabla, por ej. tendrá el campo "contraseña", parece que fetchArray() puede darme los campos correctos en la consulta.

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 
     ) 
+0

toArray es una transformación directa del objeto en un formato de matriz. fetchArray es un poco más inteligente en el sentido de que no es realmente una transformación, sino más bien una extracción. – Oddman

1

Para JSON:

$user->exportTo('json'); 

;-)

6

Problemas con $ Registro> exportTo ('json') es que exportará todos los campos de registro. Y en la mayoría de los casos no es un comportamiento deseable (por ejemplo, cuando esta pieza de json se debe pasar al navegador). Una forma de limitar el alcance de la exportación es especificar campos en DQL seleccionar:

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

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

$ user_json entonces tendrá algo como esto:

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

para que no se exponga valor del campo "contraseña", pero does exponer la estructura subyacente de la base de datos. De nuevo, puede que no sea lo que queremos. Lo que hago es especificar campos en DQL seleccione + alcanzar un precio de gama codificar entonces JSON:

$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); 

En este caso JSON se parecerá a algo como:

{ 
    "id": 123, 
    "name": "John Smith" 
} 
0

Ahora Doctrine ORM Transformations está fuera, que permite convertir entidades a matrices escalares y volver

class User implements ITransformable { 
    use Transformable; 
// ... 
echo json_encode($user->toArray()); 
+0

¡Esto es solo un enlace como respuesta! –