Laravel自定义created_at/updated_at后使用latest()报错问题
解决Laravel Eloquent自定义时间字段后
latest()方法报错问题 这个问题很常见,原因在于Laravel的latest()查询构建器方法默认硬编码使用'created_at'作为排序字段,并不会自动识别你在模型中重写的CREATED_AT常量。所以当你调用无参数的latest()时,它还是会尝试按created_at列排序,而你的表中只有creation_date列,自然就报"未知列"错误了。
这里有两种简单的解决方式:
方法一:调用latest()时显式指定自定义字段
直接在latest()方法中传入你定义的创建时间字段名即可:
dd(Visit::latest('creation_date')->get());
这种方式简单直接,适合偶尔需要使用的场景。
方法二:重写模型的latest()方法,统一默认行为
如果你希望模型的latest()方法默认就使用自定义的creation_date字段,可以在Visit模型中重写这个方法,让它优先使用模型定义的创建时间常量:
namespace App; use Illuminate\Database\Eloquent\Model; class Visit extends Model { const CREATED_AT = 'creation_date'; const UPDATED_AT = 'last_update'; public function latest($column = null) { // 如果没有传入字段,就使用模型定义的创建时间字段 return parent::latest($column ?? $this->CREATED_AT); } }
之后再直接调用Visit::latest()->get()就不会报错了,它会自动使用creation_date作为排序字段。
另外补充一点:如果你还用到了oldest()方法,也会遇到同样的问题,用同样的方式重写即可,把字段换成$this->CREATED_AT就行。
内容的提问来源于stack exchange,提问作者Zach Abrams
相关产品推荐
相关产品推荐

