2016-05-30 18 views
5

Tôi có một câu lệnh SQL lớn mà tôi đang thực hiện như sau:Laravel 5.1 DB: chọn toArray()

$result = DB::select($sql); 

Ví dụ

$result = DB::select('select * from users'); 

Tôi muốn kết quả là một mảng - nhưng vào lúc này nó sẽ trả về một cấu trúc như vậy, một mảng với các đối tượng ...

Array 
(
    0 => stdClass::__set_state(array(
     'id' => 1, 
     'first_name' => 'Pavel', 
     'created_at' => '2015-02-23 05:46:33', 
    )), 
    1 => stdClass::__set_state(array(
     'id' => 2, 
     'first_name' => 'Eugene', 
     'created_at' => '2016-02-23 05:46:34', 
    )), 
...etc... 

)

Trả lời

11

Dường như bạn cần phải cast Objects stdClass như mảng, do đó bạn có thể có cấu trúc bạn đang tìm kiếm

$result = array_map(function ($value) { 
    return (array)$value; 
}, $result); 
+0

Ý tưởng hay! Bạn có chắc Eloquent không cung cấp một chức năng để làm điều đó? –

+2

Eloquent hiện nó, nhưng bạn đang sử dụng [Query Builder] (https://laravel.com/docs/5.2/queries), không phải Eloquent – huuuk

5

toArray() phương pháp chuyển đổi bộ sưu tập thành một mảng. Mô hình cũng được chuyển thành mảng:

The toArray method converts the collection into a plain PHP array. If the collection's values are Eloquent models, the models will also be converted to arrays

Vì vậy, tôi đoán bạn đang làm điều gì sai. Nếu bạn muốn được trợ giúp thêm, vui lòng cập nhật cho bạn câu hỏi với tất cả các mã liên quan.

Ngoài ra, chỉ các bộ sưu tập Eloquent (mô hình) mới có phương thức toArray().

Để sử dụng phương pháp này, sử dụng hùng biện:

$result = \App\User::all()->toArray(); 
+0

$ result = DB :: select ($ sql) -> toArray(); – aimme

+0

ngoại lệ 'Symfony \ Component \ Debug \ Exception \ FatalErrorException' với thông báo 'Gọi hàm thành viên toArray() trên mảng' in ... –

+0

@YevgeniyAfanasyev, tôi đoán đó là câu trả lời cho mã của người được nhắm. Tất nhiên nó sẽ không hoạt động. Vui lòng hiển thị mã của bạn và tôi sẽ chỉ cho bạn cách bạn có thể chuyển đổi nó thành một mảng. –

1

Hãy thử điều này

$result = DB::select($sql); 
$arr = []; 
foreach($result as $row) 
{ 
    $arr[] = (array) $row; 
} 
+0

Điều này là sai. Tôi nhận được: local.ERROR: ngoại lệ 'Symfony \ Component \ Debug \ Exception \ FatalErrorException' với thông báo 'Gọi đến một hàm thành viên get() trên mảng' –

+0

CẬP NHẬT ngoại lệ 'ErrorException' với thông báo 'call_user_func_array() hy vọng tham số 1 là một cuộc gọi lại hợp lệ, lớp 'Illuminate \ Database \ MySqlConnection' không có phương thức 'selectRaw' ' –

+0

@huuuk, chọn chấp nhận không chỉ các tên cột: '$ users = DB :: select (' select * from users where active =? ', [1]); '- Ngoài ra, các ví dụ của bạn không hoạt động. Để làm cho một cái gì đó cuối cùng có được một cái gì đó, bạn cần phải loại bỏ '-> get()' –

1

Đây là một cách tiếp cận khác đáng được đề cập:

$resultArray = json_decode(json_encode($result), true); 

Nó hoạt động, tôi đã kiểm tra.

7

Các giải pháp tốt nhất nhìn vào hiệu suất sẽ được thay đổi phương pháp cách dữ liệu được lấy từ cơ sở dữ liệu:

// get original model 
$fetchMode = DB::getFetchMode(); 
// set mode to custom 
DB::setFetchMode(\PDO::FETCH_ASSOC); 
// get data 
$result = DB::select($sql); 
// restore mode the original 
DB::setFetchMode($fetchMode); 

Rõ ràng nếu bạn muốn để có được tất cả các dữ liệu như mảng, nó sẽ đủ để thay đổi trong config/database.php từ:

'fetch'  => PDO::FETCH_CLASS, 

vào

'fetch'  => PDO::FETCH_ASSOC, 

và sau đó chạy onl y:

$result = DB::select($sql); 

sẽ đưa bạn trở mảng đa chiều thay vì mảng các đối tượng

+0

Điều này thực sự tiên tiến. Cảm ơn. –

+1

Tôi đã tìm thấy câu trả lời này liên quan đến chủ đề này, tôi nghĩ rằng điều này có thể cải thiện những gì @Marcin đề xuất. http://stackoverflow.com/a/19369644/2848140 –

+0

Tôi gặp lỗi này trong Laravel 5.4: 'Gọi đến phương thức undefined Illuminate \ Database \ MySqlConnection :: getFetchMode()'. – Ryan

0

Bạn có thể làm theo cách này ..

Ở phía trên

use DB; 
use PDO; 

-------------------- 

DB::setFetchMode(PDO::FETCH_ASSOC); // Set the fetch mode as array 

$result = DB::select('select * from users'); 

Ví dụ, bây giờ bạn có thể có được kết quả như thế này.

$first_email = $result[0]['email']; 

Bây giờ bạn có thể chuyển sang chế độ tìm nạp mặc định.

DB::setFetchMode(PDO::FETCH_CLASS); 
1

Đối laravel/lumen 5.4 (sử dụng chiếu sáng/cơ sở dữ liệu 5.4):

$pdo = DB::getPdo(); 
$statement = $pdo->prepare($yourQuery); 
$statement->setFetchMode(\PDO::FETCH_ASSOC); 
$statement->execute(); 
$results = $statement->fetchAll(); 

Hoặc nghe Illuminate \ Database \ \ StatementPrepared sự kiện Sự kiện: Laravel 5.4 - How to set PDO Fetch Mode?

0

Cách dễ nhất là sử dụng hàm laravel toArray:

public function toArray() 
{ 
    return array_map(function ($value) { 
     return $value instanceof Arrayable ? $value->toArray() : $value; 
    }, $this->items); 
} 
+0

toArray() là phương thức, không chỉ là chức năng. Và nó chuyển đổi bộ sưu tập thành một mảng. Tôi không có một bộ sưu tập cho người mới bắt đầu, tôi có một loạt các đối tượng. Chỉ vì DB :: chọn ($ sql); trả về mảng các đối tượng. Vì vậy, câu trả lời của bạn không phải là giúp đỡ. –

0

bạn có thể thử này

DB::table('commune')->where('Commune','<>', 'ND')->orderBy('Commune')->get()->pluck('Commune'); 
Các vấn đề liên quan