2017-01-03 42 views
0

我有這樣的代碼:Laravel指定者()返回仍然在DB對象::原料

$response['data'] = DB::table('customers') 
       ->select(DB::raw('name,email,address1,address2,postalcode,state_region,country_code,phone,created_at')) 
       ->where('user_id',"=",Auth::user()->id) 
       ->where('name','like',"%$search_value%") 
       ->orWhere('address1',"%$search_value%") 
       ->orWhere('email','like',"%$search_value%") 
       ->orWhere('address2','like',"%$search_value%") 
       ->orWhere('city','like',"%$search_value%") 
       ->orWhere('postalcode','like',"%$search_value%") 
       ->orWhere('state_region','like',"%$search_value%") 
       ->orWhere('country_code','like',"%$search_value%") 
       ->orWhere('phone','like',"%$search_value%") 
       ->orderBy('name', $order) 
       ->limit($length) 
       ->offset($start) 
       ->get()->toArray(); 

這一項的結果是這樣的:

'data' => 
    array (size=10) 
     0 => 
     object(stdClass)[194] 
      public 'name' => string '|Barbara User' (length=13) 
      public 'email' => string '[email protected]' (length=16) 
      public 'address1' => string 'address aaddress' (length=17) 
      public 'address2' => null 
      public 'postalcode' => string '00000000' (length=10) 
      public 'state_region' => string 'GA' (length=2) 
      public 'country_code' => string 'US' (length=2) 
      public 'phone' => string '12312312312' (length=10) 
      public 'created_at' => string '2017-01-02 15:20:20' (length=19) 
     1 => 
     object(stdClass)[201] 
      public 'name' => string '|Barbara User' (length=13) 
      public 'email' => string '[email protected]' (length=16) 
      public 'address1' => string 'address aaddress' (length=17) 
      public 'address2' => null 
      public 'postalcode' => string '00000000' (length=10) 
      public 'state_region' => string 'GA' (length=2) 
      public 'country_code' => string 'US' (length=2) 
      public 'phone' => string '12312312312' (length=10) 
      public 'created_at' => string '2017-01-02 15:20:20' (length=19) 
    .... 

正如你所看到的,有即使我已經做了toArray(),仍然是結果中的一個對象。

這似乎是什麼問題?

您的幫助將不勝感激!謝謝!

回答

6

當你調用toArray()Collection,如果標的物實現Illuminate\Contracts\Support\Arrayable接口,集合將嘗試呼叫toArray()在每個項目上。但是,使用查詢生成器時,結果將是stdClass對象的CollectionstdClass對象是不實現該接口並且沒有toArray()方法的普通對象。因此,當您在stdClass對象的Collection上調用toArray()時,只會返回一個普通的stdClass對象數組。

如果改用口若懸河,定義Customer模型,並使用該模型來進行查詢,您的結果將是CustomerCollection一個模型,這些模型做實現Arrayable接口。所以,當你在Collection上調用toArray()時,它會調用toArray()Collection中的每個項目,你的結果將是一個數組數組。

如果出於某種原因不想使用Eloquent,則需要手動將對象中的項目轉換爲數組。您可以使用Collection上的maptransform方法輕鬆完成此操作。如果您想要返回新的Collection並保留原來的一個,請使用map;如果您只是想修改原始的Collection,請使用transform

$response['data'] = DB::table('customers') 
    // query conditions, etc 
    ->get() 
    ->map(function ($item, $key) { 
     return (array) $item; 
    }) 
    ->all(); 
+1

這是最好的答案。我不知道收集嘗試在每個項目上調用toArray()。 – devk

3

您正在將集合轉換爲數組,而不是專門針對每個模型。

你可以使用Laravel的集合->transform()方法做這樣的事情:

$response['data'] = DB::table('customers') 
      ->select(DB::raw('name,email,address1,address2,postalcode,state_region,country_code,phone,created_at')) 
      ->where('user_id',"=",Auth::user()->id) 
      ->where('name','like',"%$search_value%") 
      ->orWhere('address1',"%$search_value%") 
      ->orWhere('email','like',"%$search_value%") 
      ->orWhere('address2','like',"%$search_value%") 
      ->orWhere('city','like',"%$search_value%") 
      ->orWhere('postalcode','like',"%$search_value%") 
      ->orWhere('state_region','like',"%$search_value%") 
      ->orWhere('country_code','like',"%$search_value%") 
      ->orWhere('phone','like',"%$search_value%") 
      ->orderBy('name', $order) 
      ->limit($length) 
      ->offset($start) 
      ->get(); 

    $response['data']->transform(function ($item) { 
     // return $item->toArray(); // You could do this if you called the query with model 
     return (array)$item; // This should work in your case 
    }); 

這樣$響應[「數據」]將是一個數組的集合(不陣列)。您還可以執行以下操作:

$response['data']->toArray(); 

將集合也轉換爲數組。

+0

我得到一個'調用未定義的方法stdClass的::指定者()'在'$用品 - >指定者();' – PinoyStackOverflower

+0

這很有趣。我測試了類似的代碼(使用Model來調用,而不是\ DB :: table()),它工作。那麼我認爲阿米特古普塔的答案應該起作用。 – devk

+0

如果查詢是使用Eloquent'Model'執行的,則不需要這樣做。模型實現'Arrayable'接口,因此在'Collection'上調用'toArray()'會自動調用單個項目上的'toArray()'。 – patricus

1

您可以鍵入集合中投每個對象數組作爲:

$response['data']->transform(function($x) { 
    return (array) $x; 
})->toArray(); 

而且toArray讓你從集合返回數組。