如何自定义使用Doctrine ORM时返回的数据?

时间:2016-06-30 15:45:52

标签: php doctrine-orm symfony

我正在使用Symfony 3和Doctrine并设置实体和关系并让我的控制器返回:

  {
  "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"
      }
    }        
  ]
}

然而,这比我前端需要的信息更多。我不需要相关表格中的整个数据集,并希望这样:

{
  "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"      
    }
  ]
}

有人可以帮助我绕过Symfony这样做的方式吗?

2 个答案:

答案 0 :(得分:0)

如果使用API​​,则可以使用JMS Serializer来使用注释。     使用Doctrine \ ORM \ Mapping作为ORM;     使用JMS \ Serializer \ Annotation \ Expose;     使用JMS \ Serializer \ Annotation \ ExclusionPolicy;     使用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;

在您的控制器中获取您公开的特定数据组

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

一些文档 http://jmsyst.com/bundles/JMSSerializerBundle

答案 1 :(得分:0)

我已经得到以下代码,以便我正在尝试做的事情。不确定它是否是理想的方式?如果您有任何进一步的建议,请告诉我。

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