在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();
如果换做这样写,层级就很明显,也能拿到你想要的值。
越是复杂的多表关联的逻辑,使用闭包函数就可以避免很多杂七杂八的问题
……
更多持续更新
网友评论