Laravel

分类下相关文章

Laravel attribute casting 导致的 Indirect modification of overloaded property

在 Laravel model 中,设置了某个属性做 array casting. protected $casts = [ 'rounds' => 'array', ]; 但是在 controller 中执行 array_push($record->rounds, date("Y-m-d H:i:s")); 时,报错 production.ERROR: Indirect modification of overloaded property 可见,casting 并不支持一些针对特定类型的操作,例如无法作为指定类型的函数的参数。 按照官 ...

阅读全文...

laravel migrate 指定执行部分 migration

由于我不习惯于使用 laravel migration 来管理数据表变更,所以很多项目都是无法直接执行 php artisan migrate 否则会报错 SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'users' already exists 即,这些本该由 migrate 生成的表,已经提前由 SQL 创建了。 所以,我非常需要能够指定运行部分 migration 的方法。例如创建 job queue 相关的两个表。 将需要执行的 migration 文件复制到 new 目录下,然后执行 php ar ...

阅读全文...

laravel job 与 event 的区别

job 是异步执行。适合耗时长的任务。例如,批量发送邮件,短信。 event 是在 request 的生命周期内执行。适合耗时短的操作。例如,更改数据字段状态。 但是, event 的好处是,可以复用各种监听。例如,事件 A1 可以触发 B1, B2; 事件 A2 可以触发 B1, B2, B3。 混合使用 例如,在 event 中添加 job 任务。 参考 https://sergeyzhuk.me/2016/02/23/laravel-jobs-vs-events/ ...

阅读全文...

Laravel 的文件存储 - Storage

记录一下 Laravel Storage 的常见用法 内容写入磁盘文件 > php artisan tinker >>> use Illuminate\Support\Facades\Storage; >>> Storage::put('test.txt', 'hello'); => true ls storage/app/ public/ test.txt 文件默认创建在 /storage/app 目录下 获取文件存储的本地磁盘全路径 继续在 tinker 中测试一下 >>> storage_path() => & ...

阅读全文...

对 Laravel 的 Controller 做 Unit Test

之前尝试过对 Laravel 的 Controller 做 Feature Test,但是在业务变得越来越复杂之后,我感觉对 controller 里的函数也没了自信,急需对功能函数做 Unit Test,以平复我不安的情绪。 例如: 新建一个 Unit Test,由于默认新建的是 feature test, 所有后面需要加上 unit 参数 php artisan make:test StaffSalaryHistoryTest --unit 此时会看到 tests/Unit 目录下多了一个文件 Untracked files: (use "git add <file& ...

阅读全文...

laravel eloquent with, has whereHas 的区别

共同之处,这三个函数的参数,都是 model 中的 relationship function 的名字。 1 对 N N 对 N with 类似于 SQL 中的 left join has 类似于 SQL 中的 inner join whereHas inner join 之后,可以补充查询条件 实际应用场景 例如,backpack 中的 N 对 N 关系的过滤,使用 whereHas $this->crud->addFilter([ // select2_multiple filter 'name' => 'roles', 'type' => 'selec ...

阅读全文...

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 ...

阅读全文...

近期节日

2018年11月17日 国际大学生节
2018年11月20日 国际儿童日
2018年11月21日 世界问候日
2018年11月22日 小雪
2018年11月22日 感恩节
2018年12月01日 世界艾滋病日
2018年12月03日 国际残疾人日
2018年12月07日 大雪
2018年12月09日 "一二九"运动纪念日
2018年12月09日 世界足球日
2018年12月10日 世界人权日
2018年12月12日 西安事变纪念日
查看更多节日