Laravel 常见问题及解决方法

新版本构造函数中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();