15,laravel 常见的问题汇总(持续更新)

在blade中循环关联模型

user hasMany loginLogs

在模板渲染,可以直接通过$user->loginLogs进行循环,但如果有值,那是一个集合,可以正常循环,如果没有登录记录,则会返回null,这样foreach循环就会报错。

解决办法

@foreach($user->loginLogs as $v)
改成
@foreach($user->loginLogs ?? [] as $v) 

Trying to get property of non-object

字面意思是指,正在向一个空对象获取属性。

空对象肯定是没有属性的,如,$user->vipInfo->level,这时候,user hasOne vipInfo。通常这存在于两个表,当vipInfo没有记录时,去找level就会报上面的错误了。

所以定位问题的话,用了ORM动态属性,可以优先考虑是不是关联表的记录没了

Log::info文件日志不能传入object

Log::info用来打日志很方便,还能记录数组和字符串。

但这里要特别注意的是,Log::info是不支持直接存储对象的,对象必须经过json_encode或者转成array才能正常存储

单个Model对象转json

当使用database或者Eloquent查询数据库的时候,要么获得一行,要么获得多行。

laravel在获得单行的时候,如first、find时,得到的是个model对象,而获得多行,如get、all的时候,得到的是个集合。

集合可以使用集合类的toArray来转成数组,model对象则可以通过model的toJson转成json格式,jsonSerialize可以把单个model转成php的关联数组。

需要注意,不能对model直接进行json_encode,这样得到的不是数据库里查出来的值,而是整个对象实例会被json_encode,往往得到的不是你想要的东西

where闭包的好处

通常情况,用eloquent或database写where的时候,会直接用链式语法,但如果结构复杂,最好给where传入closure(闭包函数)

$a = User::where('status',1)
->where('name','like',"%{$k}%")
->orWhere('phone','like',"%{$k}%")
->get();

正常情况下,按上面这么写,一定拿不到你想要的结果,因为本质上,那个or的关系,是在name、phone之间平级,与status不平级,而是name or phone之后的结果才与status平级

$a = User::where('status',1)
->where(function($query) use ($key){
    $query->where('name','like',"%{$k}%")
    ->orWhere('phone','like',"%{$k}%");
})
->get();

如果换做这样写,层级就很明显,也能拿到你想要的值。

越是复杂的多表关联的逻辑,使用闭包函数就可以避免很多杂七杂八的问题

……
更多持续更新

本文出自半醒的狐狸博客

你可能感兴趣的:(15,laravel 常见的问题汇总(持续更新))