2016-07-19 32 views
1

我有設備是品牌和維修的一部分,是設備的一部分。現在我正試圖獲得一個簡單的AJAX調用,這將允許我通過品牌名稱或設備名稱來搜索設備。不幸的是,我得到了循環引用。即使我爲循環引用編寫了一個處理程序以將其限制爲一個,我仍然在我的對象中獲得了太多信息。學說:如何抑制循環引用

考慮從連載我的DQL查詢以下回報:

[{ 「0」:{ 「ID」:1, 「名」: 「iPhone 1」, 「標識」:「iPhone1 「,」brand「:{」id「:2,」name「:」Apple「,」logo「:」apple「,」devices「:[」iPhone 1「,{」id「:2, 「iPhone」, 「標誌」: 「iPhone」, 「品牌」: 「蘋果」, 「deletedAt」:空, 「修理」:[]}], 「deletedAt」:空}, 「deletedAt」:空」修理 「:[]},」 名 「:」 蘋果 「},{」 0 「:{」 ID 「:2,」 名 「:」 iPhone 「 」標誌「: 」iPhone「, 」品牌「:{」 id「:2,」name「:」Apple「,」logo「:」apple「,」devices「:[{」id「:1,」name「:」iPhone 1「,」logo「 , 「品牌」: 「蘋果」, 「deletedAt」:空, 「修理」:[]}, 「iPhone」], 「deletedAt」:空}, 「deletedAt」:空, 「修理」:[]},」名稱「:」蘋果「}]

在這裏我根本不需要修理。但是,由於它是在PartEntity中引用的,我仍然收到一堆不必要的修復信息。我如何限制從對象中獲取的數據?

我控制器代碼:

public function ajaxShowDevicesAction(Request $request) { 
    //if ($request->isXmlHttpRequest()) { 
     $data = $request->query->get('data'); 
     $result = ""; 
     if ($data) { 
      $result = $this->getDoctrine()->getManager()->getRepository('AppBundle:Device')->findAllByBrandOrName($data); 
     } 
     if ($result) { 
      $encoders = array(new XmlEncoder(), new JsonEncoder()); 
      $normalizers = array(new GetSetMethodNormalizer()); 
      $normalizers[0]->setCircularReferenceHandler(function ($object) { 
       return $object->getName(); 
      }); 
      $serializer = new Serializer($normalizers, $encoders); 
      $jsoncontent = $serializer->serialize($result, 'json'); 
      $response = new Response($jsoncontent); 
      return $response; 
     } 
     // else { # unsure how to give a "no results" response 
     //  $response = new Response(json_encode(array())); 
     //  $response->headers->set('Content-Type', 'application/json'); 
     //  return $response; 
     // } 
    // } else { 
    //  throw new HttpException(403, "Ajax access only"); 
    // } 
} 

回答

1

您可以使用正規化

setCircularReferenceLimit() 

方法。

Handling Circular References

+0

它被設置爲1,所以我應該把它設置爲0?甚至有可能確定將什麼數據傳遞給對象?出於優化目的,並不總是需要知道設備品牌的名稱,所以我會把它剪掉。 – bluppfisk