Bây giờ tôi đã đưa ra một giải pháp riêng cho điều này:
1. Đã tạo một hàm chung để trích xuất các thuộc tính cụ thể từ các mảng
Hàm bên dưới chỉ trích xuất các thuộc tính cụ thể từ một mảng kết hợp hoặc một mảng mảng kết hợp (cuối cùng là những gì bạn nhận được khi thực hiện $ collection-> toArray () trong Laravel).
Nó có thể được sử dụng như thế này:
$data = array_extract( $collection->toArray(), ['id','url'] );
Tôi đang sử dụng các chức năng sau:
function array_is_assoc( $array )
{
return is_array( $array ) && array_diff_key( $array, array_keys(array_keys($array)) );
}
function array_extract( $array, $attributes )
{
$data = [];
if ( array_is_assoc( $array ) )
{
foreach ( $attributes as $attribute )
{
$data[ $attribute ] = $array[ $attribute ];
}
}
else
{
foreach ( $array as $key => $values )
{
$data[ $key ] = [];
foreach ( $attributes as $attribute )
{
$data[ $key ][ $attribute ] = $values[ $attribute ];
}
}
}
return $data;
}
Giải pháp này không tập trung vào các hàm ý về hiệu suất khi lặp qua các bộ sưu tập trong bộ dữ liệu lớn.
2. Thực hiện những điều trên thông qua một bộ sưu tập tùy chỉnh i Laravel
Vì tôi muốn có thể thực hiện đơn giản $collection->extract('id','url');
trên bất kỳ đối tượng bộ sưu tập nào, tôi đã triển khai một lớp bộ sưu tập tùy chỉnh.
Đầu tiên, tôi tạo một Mô hình chung, mở rộng mô hình Eloquent, nhưng sử dụng một lớp tập hợp khác. Tất cả các mô hình bạn cần để mở rộng mô hình tùy chỉnh này, chứ không phải Mô hình Eloquent.
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model as EloquentModel;
use Lib\Collection;
class Model extends EloquentModel
{
public function newCollection(array $models = [])
{
return new Collection( $models );
}
}
?>
Thứ hai, tôi đã tạo lớp bộ sưu tập tùy chỉnh sau:
<?php
namespace Lib;
use Illuminate\Support\Collection as EloquentCollection;
class Collection extends EloquentCollection
{
public function extract()
{
$attributes = func_get_args();
return array_extract( $this->toArray(), $attributes );
}
}
?>
Cuối cùng, tất cả các mô hình sau đó sẽ mở rộng mô hình tùy chỉnh của bạn thay thế, như vậy:
<?php
namespace App\Models;
class Article extends Model
{
...
Bây giờ các chức năng từ không. 1 ở trên được bộ sưu tập sử dụng gọn gàng để làm cho $collection->extract()
phương pháp khả dụng.
Collection::implode()
. Nó có thể lấy một thuộc tính và trích xuất nó từ tất cả các đối tượng trong bộ sưu tập. Điều này không trả lời chính xác câu hỏi này, nhưng nó có thể hữu ích cho những người khác đã đến đây từ Google, như tôi đã làm. laravel.com/docs/5.7/collections#method-implode