Versions Compared
Key
- This line was added.
- This line was removed.
- Formatting was changed.
使用GoFrame ORM
对返回结果为空判断非常简便,大部分场景下直接判断返回的数据是否为nil
或者长度为0
,或者使用IsEmpty/IsNil
方法。
一、数据集合(多条)
Code Block | ||
---|---|---|
| ||
r, err := g.Model("order").Where("status", 1).All() if err != nil { return err } if len(r) == 0 { // 结果为空 } |
也可以使用IsEmpty
方法:
Code Block | ||
---|---|---|
| ||
r, err := g.Model("order").Where("status", 1).All() if err != nil { return err } if r.IsEmpty() { // 结果为空 } |
二、数据记录(单条)
Code Block | ||
---|---|---|
| ||
r, err := g.Model("order").Where("status", 1).One() if err != nil { return err } if len(r) == 0 { // 结果为空 } |
也可以使用IsEmpty
方法:
Code Block | ||
---|---|---|
| ||
r, err := g.Model("order").Where("status", 1).One() if err != nil { return err } if r.IsEmpty() { // 结果为空 } |
三、数据字段值
返回的是一个"泛型"变量,这个只能使用IsEmpty
来判断是否为空了。
Code Block | ||
---|---|---|
| ||
r, err := g.Model("order").Where("status", 1).Value() if err != nil { return err } if r.IsEmpty() { // 结果为空 } |
四、字段值数组
查询返回字段值数组本身类型为[]gdb.Value
类型,因此直接判断长度是否为0
即可。
Code Block | ||
---|---|---|
| ||
// Array/FindArray r, err := g.Model("order").Fields("id").Where("status", 1).Array() if err != nil { return err } if len(r) == 0 { // 结果为空 } |
五、
struct
Struct
对象(🔥注意🔥)
关于Struct
转换对象来说会有一点不一样,我们直接看例子吧。
当传递的对象本身就是一个空指针时,如果查询到数据,那么会在内部自动创建这个对象;如果没有查询到数据,那么这个空指针仍旧是一个空指针,内部并不会做任何处理。
Code Block | ||
---|---|---|
| ||
var user *User err := g.Model("order").Where("status", 1).Scan(&user) if err != nil { return err } if user == nil { // 结果为空 } |
当传递的对象本身已经是一个初始化的对象,如果查询到数据,那么会在内部将数据赋值给这个对象;如果没有查询到数据,那么此时就没办法将对象做nil
判断空结果。因此ORM
会返回一个sql.ErrNoRows
错误,提醒开发者没有查询到任何数据并且对象没有做任何赋值,对象的所有属性还是给定的初始化数值,以便开发者可以做进一步的空结果判断。
Code Block | ||
---|---|---|
| ||
var user = new(User) err := g.Model("order").Where("status", 1).Scan(&user) if err != nil && err != sql.ErrNoRows { return err } if err == sql.ErrNoRows { // 结果为空 } |
Tip |
---|
所以我们推荐开发者不要传递一个初始化过后的对象给 |
六、
struct
Struct
数组
当传递的对象数组本身是一个空数组(长度为0
),如果查询到数据,那么会在内部自动赋值给数组;如果没有查询到数据,那么这个空数组仍旧是一个空数组,内部并不会做任何处理。
Code Block | ||
---|---|---|
| ||
var users []*User err := g.Model("order").Where("status", 1).Scan(&users) if err != nil { return err } if len(users) == 0 { // 结果为空 } |
当传递的对象数组本身不是空数组,如果查询到数据,那么会在内部自动从索引0
位置覆盖到数组上;如果没有查询到数据,那么此时就没办法将数组做长度为0
判断空结果。因此ORM
会返回一个sql.ErrNoRows
错误,提醒开发者没有查询到任何数据并且数组没有做任何赋值,以便开发者可以做进一步的空结果判断。
Code Block | ||
---|---|---|
| ||
var users = make([]*User, 100) err := g.Model("order").Where("status", 1).Scan(&users) if err != nil { return err } if err == sql.ErrNoRows { // 结果为空 } |
Note |
---|
由于 |
Panel | ||
---|---|---|
| ||
|