2014-12-22 121 views
1

從雄辯的關係返回只有一列在JSON我有這樣的一個「產品」的模式來映射一個產品和條形碼之間的多對多關係:使用預先加載

public function barcodes(){ 
    return $this->hasMany('Barcode', 'productId', 'id')->select(['barcode', 'productId']); 
} 

接下來,該代碼給出我不僅是產品,還包括一系列對象中的每個條形碼。

public function search(){ 
    $results = Product::with('barcodes')->where('name', 'LIKE', 'theQueryString')->get(); 
    return Response::json($return); 
} 

這是一個示例輸出:

{ 
    "results": [ 
     { 
      "id": 1, 
      "name": "Warehouse Box", 
      "created_at": "2034-12-14 06:57:52", 
      "updated_at": "2064-12-14 06:27:52", 
      "barcodes": [ 
       { 
        "barcode": "0750028400400", 
        "productId": 1 
       }, 
       { 
        "barcode": "123456789", 
        "productId": 1 
       } 
      ] 
     } 
    ] 
} 

而不是「條形碼」返回對象的數組,我想「條形碼」只是要值的數組。

換言之,我想返回每個條形碼對象中的「條形碼」列的值而不是對象本身。

這是我希望它看起來像:

{ 
    "results": [ 
     { 
      "id": 1, 
      "name": "Warehouse Box", 
      "created_at": "2034-12-14 06:57:52", 
      "updated_at": "2064-12-14 06:27:52", 
      "barcodes": [ 
       "0750028400400", 
       "123456789" 
      ] 
     } 
    ] 
} 

有沒有用雄辯的Laravel這樣的快速和智能的方式?

回答

1

有一個lists()它使數組包含集合中每個模型的一個屬性。然而,問題在於我們必須對模型中關係的每個結果都這樣做。這將意味着你的控制器中有一個循環。 (並且我們不想要這個權利)

相反,您可以在模型中覆蓋toArray()(將在您執行Response::json()時調用)。在下面的代碼中,我們覆蓋了barcodeslists()的結果。

public function toArray(){ 
    $array = parent::toArray(); 
    $array['barcodes'] = $this->barcodes->lists('barcode'); 
    return $array; 
} 
+0

可愛!我是Laravel的新手,這個解決方案讓我大跌眼鏡。謝謝! – Zamicol

+0

不客氣:) – lukasgeiter

1

你可以通過一個封閉的with方法,並指定要使用select方法來選擇哪些列:

public function search(){ 
    $results = Product::with(array('barcodes' => function($query) { 
     return $query->select('barcode'); 
    }))->where('name', 'LIKE', 'theQueryString')->get(); 

    ... 

,然後你可以使用在Laravel的集合類提供了collapse方法:

$results->barcodes = $results->barcodes->collapse(); 
+0

感謝您的回覆。不幸的是,這並沒有什麼幫助,因爲您還必須選擇外鍵的列,在這種情況下,'productId'。好主意,但這是我遇到的同樣的問題。我仍然需要從條形碼中刪除ID列。 – Zamicol

+0

您應該嘗試在條碼模型中添加'$ visible'屬性來定義導出到JSON /數組的字段。 –