Laravel

分类下相关文章

Laravel Eloquent 数据查询结果中日期的格式化

两种情况: 使用 Model 的查询 例如: $item = App\Models\Apple::first(); $date = $item->created_at->format('Y-m-d'); 使用 DB::table 的查询 如果直接对结果中的 datetime 做 format,会报错 Call to a member function format() on string 因为 DB::table 返回的结果都是 string,没有关联 Model。当然各种定义好的自动转换也会失效。 这时候就需要先解析,再格式化 Carbon\Carbon::parse($i ...

阅读全文...

在 laravel 的 DB::transaction 中,为外部变量赋值

例如,我想在 laravel 的事务中,对某个外部变量赋值,然后在后续的逻辑中判断该变量的属性 $user = null; // init DB::transaction(function() use($user) { // do something with user }); // check user if ($user->name) { // bla, bla } 这样会报错 Trying to get property of non-object at 也就是说,在 PHP 中,即使是对象也不会默认采用引用的方式传参。 需要修改为 DB::transaction( ...

阅读全文...

Laravel 中设置 Carbon 的 diffForHumans 方法返回中文

在写 feed 流功能时,经常要用到 Carbon 的 diffForHumans 方法,以方便返回直观的时间描述。 例如 Carbon::parse($date)->diffForHumans(); 10秒前 5分钟前 但是,默认 Carbon 并不会遵守 laravel config 中的 locale,需要特别指定。 编辑 app/Providers/AppServiceProvider.php use Carbon\Carbon; public function boot() { Carbon::setLocale('zh'); } 参考 https://lar ...

阅读全文...

周期性归档 laravel 日志

周期性归档 laravel 日志 laravel 内置的日志功能,没有归档功能(按日期归档那个太简单了,不能限制个数)。 而 Ubuntu 内置的 logrotate 功能正好可以用来处理 laravel 日志。 参考:Log Rotation with logrotate - 运维 在 /etc/logrotate.d 目录下,新建一个 laravel 文件,内容拷贝 nginx 的配置即可,删掉没用的部分。 su www-data www-data /xxxstorage/logs/*.log { daily missingok rotate ...

阅读全文...

MySQL 由 5.7 升级为 8.0 之后,Laravel 的配置改动

开发机上升级了 MySQL 8.0, 原有的 Laravel 5.5 项目就启动失败了。 报错信息是: [2018-05-30 11:17:37] local.ERROR: SQLSTATE[42000]: Syntax error or access violation: 1231 Variable 'sql_mode' can't be set to the value of 'NO_AUTO_CREATE_USER' 解决方法是: config/database.php 中的 strict 值修改成 false. ...

阅读全文...

Laravel 的 JSON API 接口自动化测试

这两天写了几个接口,赶得急,完全没有测试。上线之后,前端的同事一调用,各种 500 错误。。。 甚是尴尬,老脸有点兜不住,所以今天决定把新增的接口 API 都加上自动化测试。 Laravel 自带了两种测试类型 Feature Test: 功能测试。针对类似接口这种流程性的测试。 Unit Test: 单元测试。针对单个函数这种输入输出结果的测试。 新建一个 Feature Test php artisan make:test FinishOrderTest 项目根目录下多了一个文件 tests/Feature/FinishOrderTest.php 安装 phpunit 要执行测试案 ...

阅读全文...

Laravel firstOrNew 与 firstOrCreate 的区别

例如: $item = App\Deployment::firstOrNew( ['name' => '问答小程序'], ['delayed' => 1] ); firstOrNew 需要手动调用 save,才会保存到数据库。适合同时需要修改其他属性的场景。 firstOrCreate 会自动保存到数据库。适合不需要额外修改其他属性的场景。 注意:MassAssignmentException firstOrCreate 一定要设置 model 的 fillable, 否则会报 MassAssignmentException 的错误。 参考: Laravel Mode ...

阅读全文...

Laravel collection 报错 join(): Invalid arguments passed

混淆了 array 与 collection,join 并不支持 collection. array 与 collection 不同的 join 实现 collect([1, 2, 3, 4, 5])->implode('-'); join('-', [1, 2, 3, 4]); 将 array 转换成 collection $collection = collect([1, 2, 3]); 将 collection 转换成 array $collection->toArray(); all() 与 toArray() 的区别 如果 collection 中的 item 是 ...

阅读全文...

清理 laravel blade 模板缓存

早上遇到一个奇怪的问题,写了一个简单 laravel backpack table view 页面,打开时反复报错 View [inc.datatables_logic] not found 在 vendor 下 grep 了一下,根本找不到 inc.datatables_logic 的使用记录。 而 inc.datatables_logic 是新版本的 backpack crud 引入的,我用的是旧版本,根本没有这个引用。所以,我联想到会不会是昨天升级 backpack crud 3.4 失败,回滚之后,虽然代码恢复了,但是 blade 模板依然被缓存了。。。 php artisan v ...

阅读全文...

laravel console - 自定义命令

在改造一个支付流程,新的流程加入了一个新的数据表字段,但是这个新的字段需要通过计算来填充,所以为了兼容历史数据,必须将已有的数据行重新计算一遍该字段。 这时使用 laravel console 命令就非常方便,因为可以共用 .env 中的数据库连接配置,以及定义好的 model。 自动创建 console 命令类 php artisan make:command YourCommand 这时会看到目录 app/Console/Commands 下多了一个新的命令类,在 handle 中写计算逻辑即可。 console 命令类的几个必填项 signature 命令名及参数指定 descrip ...

阅读全文...

使用 laraval migration 修改数据库表结构

之前一直使用 sql 文件来保存并跟踪数据库表结构的变化。但是使用 sql 文件有以下弊端: 无法判断哪些 sql 文件执行了,哪些没执行。虽然加了日期做为 sql 文件名前缀,但是在多人开发,且长时间没有更新线上数据表结构时,经常要挠头 执行 sql 文件是件体力活。当你面对十几个 sql alter 文件时,逐个执行非常累心。 多套开发、生产环境同步起来还是费时费力。例如,PC 开发机上进行了一次修改,还要同步到笔记本开发环境上,想想都难受。 这些问题,远不如执行一行 migration 来的痛快。 增加一个新字段 例如,我要给 articles 表增加一个 images 字段。 首先 ...

阅读全文...

Laravel Backpack reorder 视图的复用

影响复用的几个因素 API URL 抽象 local storage key 前缀 但是通过 $crud 就非常好解决。因为在 backpack admin controller 中有这样一行 $this->crud->setRoute(...); 这说明,API URL 可以通过 crud 的 route 取出来。看一下 $crud 的属性 dd($crud); CrudPanel {#988 ▼ +model: Category {#716 ▶} +route: "admin/categories" +entity_name: "分 ...

阅读全文...

Laravel Backpack 分类管理功能的用户体验优化

Backpack 自带的分类管理界面,用户体验非常不好。因为其默认的首页是分类列表,而不是分类树形展示。 最简单有效的做法是重写 reorder 组件。 我预期的效果是这样的,参考了 wordpress 分类管理页面的设计 复制 ./vendor/backpack/crud/src/resources/views/reorder.blade.php 到目录 resources/views/vendor/backpack/crud/ 通过 Ajax 新建分类 首先,确认 backpack 是否已支持 ajax CRUD。 从列表页的 delete 操作来看,确实是默认支持的 Request U ...

阅读全文...

Laravel Backpack 同一个自定义 field 组件在单页内多次出现的处理

Bug 描述 之前写了个自定义的 summernote 富文本框组件,可以将插入图片自动同步到七牛 CDN。 但是,如果页面中使用了两个该组件,第二个文本框插入的图片都会插入到第一个中。。。 问题产生的原因是,使用的是 class 选择器,都选择了 .summernote 解决方法 解决思路非常简单,为每个组件定义不同的 ID。 令人浑身发痒的地方是,需要在 js 里嵌入 PHP 代码 HTML 部分 <textarea id="summernote_{{ $field['name'] }}" name="{{ $field['name'] }} ...

阅读全文...

Laravel Backpack Create Model 时生成随机值,该字段在用户界面不可见

有时,需要在 create 时自动生成一些字段的值,而编辑时该字段不可改变。 public static function boot() { parent::boot(); self::creating(function($model){ $model->order_id = Utils::generate_random_order_id(); }); } ...

阅读全文...