2016-06-30 5 views
0

Ich bin mit Symfony 3 und Lehre und habe Entitäten und Beziehungen Setup und habe meine Controller Rückkehr:Wie passe ich Daten an, die zurückgegeben werden, wenn Doctrine ORM verwendet wird?

{ 
    "retrieved": "2016-06-30T16:47:49+0200", 
    "currentPage": "1", 
    "totalItems": "3", 
    "itemsPerPage": "50", 
    "tasks": [ 
    { 
     "id": 1, 
     "tasktitle": "This is the first task", 
     "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.\\", 
     "duedate": "2016-12-25T23:59:59+0100", 
     "dateadded": "2016-06-20T16:43:06+0200", 
     "projectid": { 
     "id": 1, 
     "name": "PM Tool", 
     "dateadded": "2016-06-20T16:43:06+0200", 
     "createdbyuserid": { 
      "id": 1, 
      "firstname": "test", 
      "lastname": "test" 
     }, 
     "userid": [] 
     }, 
     "taskstatus": { 
     "id": 1, 
     "taskstatus": "Not Started" 
     }, 
     "priority": { 
     "id": 1, 
     "priority": "Urgent" 
     } 
    }, 
    { 
     "id": 2, 
     "tasktitle": "Code this beast", 
     "description": "This project is going to be sweet.", 
     "duedate": "2016-12-26T23:59:59+0100", 
     "dateadded": "2016-06-20T16:43:06+0200", 
     "projectid": { 
     "id": 1, 
     "name": "PM Tool", 
     "dateadded": "2016-06-20T16:43:06+0200", 
     "createdbyuserid": { 
      "id": 1, 
      "firstname": "test", 
      "lastname": "test" 
     }, 
     "userid": [] 
     }, 
     "taskstatus": { 
     "id": 9, 
     "taskstatus": "Completed" 
     }, 
     "priority": { 
     "id": 3, 
     "priority": "Medium" 
     } 
    }   
    ] 
} 

jedoch auf diese Weise mehr Informationen als ich für mein Front-End benötigen. Ich brauche nicht den gesamten Datensatz aus den dazugehörigen Tabellen und wäre so etwas wie dies mag:

{ 
    "retrieved": "2016-06-30T16:47:49+0200", 
    "currentPage": "1", 
    "totalItems": "3", 
    "itemsPerPage": "50", 
    "tasks": [ 
    { 
     "id": 1, 
     "tasktitle": "This is the first task", 
     "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.\\", 
     "duedate": "2016-12-25T23:59:59+0100", 
     "dateadded": "2016-06-20T16:43:06+0200", 
     "projectname": "PM Tool",  
     "taskstatus": "Not Started", 
     "priority": "Urgent" 
    }, 
    { 
     "id": 2, 
     "tasktitle": "Code this beast", 
     "description": "This project is going to be sweet.", 
     "duedate": "2016-12-26T23:59:59+0100", 
     "dateadded": "2016-06-20T16:43:06+0200", 
     "projectid": "PM Tool",  
     "taskstatus": "Completed" 
     "priority": "Medium"  
    } 
    ] 
} 

Könnte jemand mir helfen, meinen Kopf zu wickeln um die Symfony Art und Weise, dies zu tun?

+0

Was gibt diesen JSON-Code zurück? Oder ist das nur ein Dump() im Zweig? –

+0

$ tasks = $ this-> getDoctrine() -> getRepository ('AppBundle: Task') -> findBy ( array(), array ('id' => 'ASC'), // sortieren nach $ count , ($ page - 1) * $ count // offset ); $ tasks = $ query-> getResult(); $ data = [ 'abgerufen' => $ Datum-> Format ('Ymd \ TH: i: sO'), 'current' => $ Seite, 'totalItems' => $ total, ‚ItemsPerPage '=> $ count, ' Aufgaben '=> $ Aufgaben ]; $ view-> setData ($ Daten) -> setStatusCode (200); zurück $ view; – SirM

+0

Wenn Sie mehr Daten haben, als Sie brauchen, dann erstellen Sie einfach Ihr eigenes Array und transformieren Sie es in json. Und niemanden beleidigen, außer Symfony, der angeblich eine so große Gemeinschaft von Unterstützern, Experten und so weiter hat, die sicherlich schon einmal ein ähnliches Problem oder ähnliches hatten, warum kann dann niemand diese scheinbar einfache Frage beantworten? Ich habe eine Frage 3 mal auf 3 verschiedene Arten ohne direkte Antwort gestellt. – pogeybait

Antwort

0

ich den Code unten bekommen habe aussetzen gut arbeiten für das, was ich bin versuchen zu tun. Nicht wirklich sicher, ob es der ideale Weg ist oder nicht? Wenn Sie weitere Empfehlungen haben, lassen Sie es mich bitte wissen.

  $em = $this->getDoctrine()->getManager(); 
      $query = $em->createQuery("SELECT t.id as TaskId, 
               t.tasktitle as TaskTitle, 
               ts.taskstatus as TaskStatus, 
               p.name as ProjectName, 
               c.clientname as Cient, 
               IDENTITY(t.jobnumber) as Jobnumber, 
               t.duedate as DueDateTime, 
               t.lastupdated as LastUpdated, 
               IDENTITY(p.accesstypeid) as AccessType, 
               (SELECT IDENTITY(s.userid) FROM AppBundle:Subscriber s WHERE s.taskid = t.id AND s.isowner = true) as Owner 
             FROM AppBundle:Task t 
             JOIN t.projectid p 
             LEFT JOIN p.clientid c 
             JOIN t.taskstatus ts 
             LEFT JOIN t.jobnumber j 
             WHERE 
             (?1 IS NULL OR t.duedate < ?1) 
             AND (LENGTH(?2) = 0 OR p.id = ?2) 
             AND (LENGTH(?3) = 0 OR c.id = ?3) 
             AND (ts.taskstatus != 'Completed' AND ts.taskstatus != 'Deleted') 
             ") 
             ->setFirstResult($offset) 
             ->setMaxResults(50); 

      $query->setParameter(1,$duefiltervalue); 
      $query->setParameter(2,$projectfilter); 
      $query->setParameter(3,$clientfilter); 
      $tasks = $query->getResult(); 

      $data = [ 
       'retrieved' => $date->format('Y-m-d\TH:i:sO'), 
       'currentPage' => $page, 
       'totalItems' => $total, 
       'itemsPerPage' => $count, 
       'tasks' => $tasks 
      ]; 

      $view->setData($data)->setStatusCode(200); 

      return $view; 
0

Sie können JMS-Serializer verwenden, um Anmerkungen zu verwenden, wenn Sie eine API verwenden. Verwenden Sie Doctrine \ ORM \ Mapping als ORM; Verwenden Sie JMS \ Serializer \ Annotation \ Expose; Verwenden Sie JMS \ Serializer \ Annotation \ ExclusionPolicy; Verwenden Sie JMS \ Serializer \ Annotation \ Groups;

/** 
* Book 
* 
* @ORM\Entity 
* @ORM\Table() 
* @ORM\HasLifecycleCallbacks 
* 
* @ExclusionPolicy("all") 
*/ 

class Book 
{ 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    * 
    * @Groups({"book"}) 
    * @Expose 
    */ 
    private $id; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="isbn", type="string", length=255) 
    * @Groups({"book"}) 
    * @Expose 
    */ 
    private $isbn; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="title", type="string", length=255) 
    * @Groups({"book"}) 
    * @Expose 
    */ 
    private $title; 

Und in Ihrem Controller erhalten die spezifische Gruppe von Daten, die Sie

/** 
* @View(serializerGroups={"book"}) 
*/ 
public function comingKoobAction($piBookId) 
{ 
    $loManager = $this->getDoctrine()->getManager(); 
    return $loManager->getRepository("AppBundle:Book")->find($piBookId); 
} 

Einige Dokumentation http://jmsyst.com/bundles/JMSSerializerBundle