Función de Multi Row Toyson usando propulsión y columna vertebral -- php campo con json campo con orm campo con propel campo con slim camp Relacionados El problema

Multi row toJSON function using Propel and Backbone


2
vote

problema

Español

Estoy tratando de hacer lo que debería ser una función "Lista" muy simple "con propulsión ORM, para leer Backbone.js para leer. Esto es lo que quiero hacer, y en mi opinión, debería trabajar:

  docker-compose -f production.yml run --rm django python manage.py compress 3  

Sin embargo, cuando estoy ejecutando eso, los resultados que estoy obteniendo son:

  docker-compose -f production.yml run --rm django python manage.py compress 4  

Si bien es válido, JSON, el hecho de que alguna vez la fila es una matriz en la matriz principal está desechando a mi JSON. Lo que necesito para volver es JSON así:

  docker-compose -f production.yml run --rm django python manage.py compress 5  

He creado la función a continuación (como prueba) y funciona perfectamente, pero seguramente propele (o delgado, el marco que estoy usando) tiene manera de detener que todo está dentro de una matriz? Aquí el hacke;

  docker-compose -f production.yml run --rm django python manage.py compress 6  

¡Cualquier ayuda sería muy apreciada! Gracias a todos.

Original en ingles

I'm trying to make what should be a very simple "list all" function using Propel ORM - for Backbone.js to read. This is what I want to do, and in my opinion, should work:

$users = UsersQuery::create() ->find();  echo $users->toJSON(); 

However, when I'm running that, the results I'm getting are:

{"Users_0":{"Id":1,"EmailAddress":"sdf","Password":"sdf","CreatedAt":null,"ModifiedAt":null}, "Users_1":{"Id":2,"EmailAddress":"dsf","Password":"sdf","CreatedAt":null,"ModifiedAt":null}} 

Whilst it's valid JSON, the fact that ever row is an array in the main array is throwing off my JSON. What I need it to return is JSON like this:

[{"Id":1,"EmailAddress":"sdf","Password":"sdf","CreatedAt":null,"ModifiedAt":null},{"Id":2,"EmailAddress":"dsf","Password":"sdf","CreatedAt":null,"ModifiedAt":null}] 

I've created the below function (as a test) and it works perfectly, but surely Propel (or Slim, the framework I'm using) has way of stopping everything being inside an array? Here the hack;

$users = UsersQuery::create() ->find();  $json = '['; foreach($users as $user){     $json = $json.$user->exportTo('JSON').','; } $json = $json.']'; echo str_replace("},]", "}]", $json); 

Any help would be greatly appreciated! Thanks all.

              

Lista de respuestas

1
 
vote
vote
La mejor respuesta
 

Odio decirlo, pero creo que esto es solo uno de esos situaciones de "eso es lo que imprime funciona". Dicho esto, podría mejorar su función de ayudante un poco más robusta.

Pondría este código en su clase de userQuery:

  dispatch_async6  

y luego usarlo así ...

  dispatch_async7  

o si tiene otros criterios ...

  dispatch_async8  
 

I hate to say it, but I think this is just one of those "that's how Propel works" situations. That said, you could improve your helper function a little to be more robust.

I would put this code in your UserQuery class:

class UsersQuery extends BaseUsersQuery {   ...    public function toJSONArray() {     $users = $this->find();     $userArray = array();     foreach($users as $user){       array_push($userArray, $user->toArray());     }     return json_encode($userArray);   } } 

And then use it like so...

$userJSON = UsersQuery::create()->toJSONArray(); 

Or if you have other criteria...

$userJSON = UsersQuery::create()               ->filterBySomeField("someValue")               // other Criteria ...               ->toJSONArray(); 
 
 
   
   
0
 
vote

¿Hay una posible solución para usar este y un filtro seleccionado en una sola declaración? Algo así:

  dispatch_async9  
 

is there a possible solution to use this and a select filter in one statement. Something like this:

   $ojson = TblproductQuery::create()         ->select(array('ProdtID', 'DivnID'))         ->toJsonArray(); 
 
 
0
 
vote

Una cosa que la respuesta aceptada no aborda es cuando tiene un objeto con una recolección anidada. Como tal vez tenga un montón de pruebas con respuestas así:

  [   {     id:test1,     answers : [       { id: 1, answer: pig},       { id: 2, answer: dog}     ]   },   {     id:test2,     answers : [       { id: 5, answer: duck},       { id: 6, answer: swan}     ]   } ]   

Lo anterior no se reproducirá muy bien con las colecciones de backbone cuando intenta usar la respuesta aceptada. Esto se debe a que cada modelo de propulsión llamará al método function Add-PromptSection() { [CmdletBinding()] Param( [ConsoleColor]$Fore, [ConsoleColor]$Back="Red", [Switch]$Newline, [Scriptblock]$Condition, [String]$String ) Write-Host $args } 1 en cualquier colección de propulsión dentro de sí misma

El método PopelCollection::toArray() se devolverá a sí mismo como una matriz asociativa en PHP, que se convierte en un conjunto insonorizado en JSON en lugar de una matriz. Las colecciones de la columna vertebral están ordenadas (matrices) solamente.

Para solucionar esto, acabo de cambiar el método function Add-PromptSection() { [CmdletBinding()] Param( [ConsoleColor]$Fore, [ConsoleColor]$Back="Red", [Switch]$Newline, [Scriptblock]$Condition, [String]$String ) Write-Host $args } 3 en el archivo de origen propulsado PropelCollection.php a lo siguiente:

  public function toArray(     $keyColumn = null,      $usePrefix = false,      $keyType = BasePeer::TYPE_PHPNAME,      $includeLazyLoadColumns = true,      $alreadyDumpedObjects = array()){    $ret = array();   foreach ($this as $key => $obj) {     array_push($ret, $obj->toArray($keyType, $includeLazyLoadColumns,        $alreadyDumpedObjects, true);   }    return $ret; }   

No he visto cómo esto afecta a los métodos TOXML o TOYAML, pero permite que el método TOJSON funcione como quiero con colecciones anidadas como mi ejemplo anterior.

 

One thing the accepted answer does not address is when you have an object with a nested collection. Like maybe you have a Bunch of tests with answers like so:

[   {     id:test1,     answers : [       { id: 1, answer: pig},       { id: 2, answer: dog}     ]   },   {     id:test2,     answers : [       { id: 5, answer: duck},       { id: 6, answer: swan}     ]   } ] 

The above won't play nicely with backbone collections when you try to use the accepted answer. This is because every propel model will call the PropelCollection::toArray() method on any propel collections within itself

The PopelCollection::toArray() method will only return itself as an associative array in php which gets converted to an unsorted set in JSON rather than an array. Backbone collections are sorted (arrays) only.

To fix this, I just changed the toArray() method in the propel source file PropelCollection.phpto the following:

public function toArray(     $keyColumn = null,      $usePrefix = false,      $keyType = BasePeer::TYPE_PHPNAME,      $includeLazyLoadColumns = true,      $alreadyDumpedObjects = array()){    $ret = array();   foreach ($this as $key => $obj) {     array_push($ret, $obj->toArray($keyType, $includeLazyLoadColumns,        $alreadyDumpedObjects, true);   }    return $ret; } 

I haven't seen how this affects the toXML or toYAML methods, but it allows the toJSON method to work as I want with nested collections like my example above.

 
 

Relacionados problema

0  slim.conv2d y tf.nn.conv2d  ( Slim conv2d and tf nn conv2d ) 
En mis experimentos, ambos realizan el uso de la red slim.conv2d(relu = none) y tf.nn.conv2d , encontré que hay una diferencia entre estos 2 ops. para l...

1  No puede obtener el cuerpo de la solicitud de eliminación con un marco delgado  ( Cannot get body from delete request with slim framework ) 
Estoy trabajando en una aplicación usando backbone.js y marco delgado. El problema está aquí: necesito eliminar un registro ejecutando un procedimiento almace...

1  No se puede conseguir que los cors trabajen con una API delgada  ( Unable to get cors working with a slim api ) 
Estoy realmente luchando para conseguir que CORS trabajando con Slim y Angularjs Solicitud HTTP de AngularJS: $http({ method: 'GET', headers: { ...

2  Regla de autorización HTTP en HTACCESS- CONVERTIDAR A NGINX  ( Http authorization rule in htaccess convert to nginx ) 
Recientemente he movido mi solicitud de Apache a Nginx Server. Hemos escrito API está en marco delgado. Por lo tanto, para mejorar la seguridad básica de la A...

1  Marco delgado, no se puede llegar a la conexión de PDO SQL Server que está dentro de un contenedor de un controlador  ( Slim framework cannot reach pdo sql server connection that is inside a containe ) 
En mi app.php configuro un contenedor donde configuro la conexión de la base de datos: $container['db'] = function ($c) { $db = $c['settings']['d...

0  Pathfor no funciona en el marco delgado 3  ( Pathfor not working in slim framework 3 ) 
En Slim 3, tengo una ruta con un camino con nombre $app->get('/admin/edit-course/{id}', 'AdminController:edit_course')->setName('/admin/edit-course'); ...

8  El servidor incorporado de PHP muestra la página de índice en lugar del archivo estático  ( Php built in server shows index page instead of static file ) 
He creado un proyecto con Slim 3 y Twig usando sus ejemplos más simples. La estructura de la carpeta es la siguiente: - public - index.php - styl...

0  SLIM V3 PUT METHET y recupere los datos de publicación  ( Slim v3 put method and retrieve post data ) 
He agregado la ruta para actualizar los correos electrónicos en una base de datos que usa el método de PUT $app->put('/notifications/{email}', 'add_email_a...

26  Slim Framework siempre devuelve el error 404  ( Slim framework always return 404 error ) 
En estos días, estoy usando delglés 'Slim Framework como mi herramienta más simple para desarrollar la API web PHP. Usando estos dos artículos: coeneret...

5  ¿Cómo puedo agregar un filtro personalizado a mis plantillas de ramitas dentro de Slim?  ( How can i add a custom filter to my twig templates inside of slim ) 
usando el ejemplo de http://twig.senseniolabs.org/ DOC / Advanced.HTML # Creación-AN-Extension : Dentro de mi archivo Slim que crea la vista: $filter = ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos