laravel collection 的问题

150 篇文章 5 订阅
4 篇文章 0 订阅

今天在使用laravel的时候碰到个问题,我在模型里面使用了修改器,把type对应的数字变成了显示的中文,像下面这样:

1、collection的坑

public function getTypeAttribute($value)
{
 $labelType = [
    1 => '个性',
    2 => '风格',
    3 => '用户评论标签',
 ];
 return $labelType[$value]??'';
}

然后再使用collection进行筛选的时候就出问题了,

public function getLabels($type = 0)
{
    $data = Label::where('status', 1)->get();
    $need = (object) [];
    if ($type == 1) {
        $need->character = $data->where('type', 1);
        $need->style = $data->where('type', 2);
        $need->customer_give_label = $data->where('type', 3);
        return $need;
    }
    return $data;
}

结果发现$need取不到值,让我疑惑的不是这里,二是我在这里打印$data的时候里面的不论是attributes还是original里面的type都还显示的是数字!这个就有点匪夷所思了。

然后我就想到了要去
D:\phpStudy\WWW\xxx\vendor\laravel\framework\src\Illuminate\Support\Collection.php
直接查看 construct ,可以看到,这个就说明在使用collection进行筛选的时候,第一部就把转成数组了,难道是在这个时候修改器起作用了?一般说来,对于单个数据,修改器作用在attributes里面,而原始数据放在original里面,但是取出的结果是个列表的时候,情况就变了,original和sttributes里面的都是原始数据。所以,这里尤其要注意,我认为这是个bug,等空了在gitHub上提个issue.

public function __construct($items = [])
{
    $this->items = $this->getArrayableItems($items);
}

bug2:ORM里面的value方法,这个也是有坑

D:\phpStudy\WWW\xxx\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Builder.php
进到这里面可以看到,value方法是这么说的,value方法可以取到结果集里面的第一个数据指定的column,但是实际上,却不是这么回事。我在使用find之后,链式连接value方法,结果变成了到那个表里面去查询第一个数据的这个column了。。。这就比较尴尬了,这也是不太容易发现的地方,这里记录一下,后续提issue,然后更新。

/**
 * Get a single column's value from the first result of a query.
 *
 * @param  string  $column
 * @return mixed
 */
public function value($column)
{
    if ($result = $this->first([$column])) {
        return $result->{$column};
    }
}
code:
\DB::enableQueryLog();
$res = Course::find($course_type)->value('class_hour');
dd($res, \DB::getQueryLog());
result:

array:2 [
0 => array:3 [
“query” => “select * from course where course.id = ? limit 1”
“bindings” => array:1 [
0 => “4”
]
“time” => 8.43
]
1 => array:3 [
“query” => “select class_hour from course limit 1”
“bindings” => []
“time” => 7.67
]
]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
要在 Laravel 中导出 Excel,你可以使用 Laravel Excel 这个扩展包。下面是简单的步骤: 1. 使用 Composer 安装 Laravel Excel ``` composer require maatwebsite/excel ``` 2. 在 `config/app.php` 文件中添加服务提供者和门面 ```php 'providers' => [ // ... Maatwebsite\Excel\ExcelServiceProvider::class, ], 'aliases' => [ // ... 'Excel' => Maatwebsite\Excel\Facades\Excel::class, ], ``` 3. 创建控制器和视图 创建一个控制器来处理 Excel 导出的逻辑,例如 `ExcelController`,并在其中创建一个 `export()` 方法来生成 Excel 表格。 ```php namespace App\Http\Controllers; use Illuminate\Http\Request; use Maatwebsite\Excel\Facades\Excel; use App\Exports\UsersExport; class ExcelController extends Controller { public function export() { return Excel::download(new UsersExport, 'users.xlsx'); } } ``` 在 `app/Exports` 目录下创建一个 `UsersExport` 类,用于生成 Excel 数据。 ```php namespace App\Exports; use App\User; use Maatwebsite\Excel\Concerns\FromCollection; class UsersExport implements FromCollection { public function collection() { return User::all(); } } ``` 创建一个视图文件来呈现导出 Excel 表格的按钮,例如 `export.blade.php`。 ```html <a href="{{ route('export') }}">Export Users</a> ``` 4. 定义路由 在 `routes/web.php` 文件中定义一个路由,指向 `ExcelController` 的 `export()` 方法。 ```php Route::get('export', 'ExcelController@export')->name('export'); ``` 现在,当用户访问 `/export` 路径时,会生成一个名为 `users.xlsx` 的 Excel 文件,包含用户数据

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SHUIPING_YANG

你的鼓励是我创作的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值