新版本构造函数中session
获取问题
最近的一个项目使用了新版本的Laravel,结果发现5.3版本及之后在控制器的构造函数中无法获取到session,因为session中间件还没有启动;替代方案是在控制器构造函数中使用Closure来直接定义中间件
public function __construct()
{
$this->middleware(function ($request, $next) {
$this->projects = Auth::user()->projects;
return $next($request);
});
}
上传文件时被重定向变两次访问
做一个文件上传时,本地window正常,linux服务器上一次上传被重定向了,发现两次访问地址相差一个/
,原来是上传请求地址末尾多写了一个/
的原因,去掉即可
使用 firstOrCreate 或 updateOrCreate 判断是否新增
$user = User::createOrUpdate([...]);
if(!$user->wasRecentlyCreated){
// 新用户处理
} else {
// 更改的值
$changes = $user->getChanges();
}
每条记录都查询固定数量的关联记录
模型关联查询时,若每条记录都想查询固定数量的关联记录,因为 Laravel 是使用 in 来查询关联记录的,因此用普通的 limit 是无法做到的,我们需要对关联关系做一下重写,具体实现如下:
$users = User::where([...])
->with('comments')
->map(function ($item) {
$item->setRelation('comments', $item->comments->take(3));
return $item;
});
ORM模型中如何取消蛇形命名方式
public static $snakeAttributes = false;
ORM修改器的生效问题
修改器的生效过程发生在访问和序列化的过程中,如果修改器的逻辑判断涉及到其他字段,请务必在结果集中要查询出这些字段,否则修改器的结果跟预期会不符;
如果想获取未修改过的值,可以调用getOriginal()
方法;
你也可以定义一个开关变量,由它来控制修改器的开关;
ORM临时修改可见属性
$user->makeVisible('attribute')->toArray();
$user->makeHidden('attribute')->toArray();