ORM关联查询示例
简单介绍一下关联查询的使用场景和方法
表结构和数据准备
users 用户表
| user_id | user_name |
| ------- | ---------- |
| 1 | Siam(宣言) |
phones 手机信息表
| phone_id | can_use | user_id | phone_name |
| -------- | ------- | ------- | ---------- |
| 1 | 1 | 1 | 诺基亚A1 |
| 2 | 0 | 1 | 苹果11 |
| 3 | 1 | 2 | 三星ZD |
定义模型的步骤就不说了,这是ORM的基础使用。
应用场景
我们现在需要提供一个接口,根据user_id来查询用户的信息,以及这个用户名下的所有手机信息
正常我们需要new两个模型、手动传参来获取手机信息,但是使用关联查询,可以简化这个过程
定义关联关系
首先我们需要在模型文件中定义两者的关系(用于查询时自动构建条件语句)
class Users extends AbstractModel
{
protected $tableName = 'users';
public function phones(){
// users的phones方法,指向Phones模型,也就是phones表
// 第二个参数用于更灵活的筛选目标数据,不修改则传递null
// 第三个参数代表:根据Users模型的user_id字段的值去获取目标数据
// 第四个参数代表:Phones表上当做条件语句的字段名
// 构建的语句大概为 select * from phones where user_id(第四个参数) = $Users.user_id (第三个参数)
return $this->hasMany(Phones::class, function ($builder){
}, 'user_id', 'user_id');
}
}
使用,返回的数据就是拥有手机信息列表的
$user = Users::create()->get(1);
$phones = $user->phones(); // 这一步可以用预查询完成 简化语句
$this->response()->write(json_encode($user));
更灵活的筛选数据方式
第二个参数是一个闭包,可以很灵活地调用mysqli中的QueryBuilder方法
//状态正常的手机信息
public function phones(){
return $this->hasMany(Phones::class, function ($builder){
$builder->where('can_use', 1);
}, 'user_id', 'user_id'); // 这里填写主表字段的值储存在附表的哪个字段上
}
// 排序
public function phones_desc(){
return $this->hasMany(Phones::class, function ($builder){
$builder->orderBy('phone_id', "DESC");
}, 'user_id', 'user_id'); // 这里填写主表字段的值储存在附表的哪个字段上
}
// 返回部分数据
public function phones_limit(){
return $this->hasMany(Phones::class, function ($builder){
$builder->limit(1);
}, 'user_id', 'user_id'); // 这里填写主表字段的值储存在附表的哪个字段上
}
// where筛选
public function iphone(){
return $this->hasOne(Phones::class, function($builder){
$builder->where('phone_name', "苹果11");
}, 'user_id', 'user_id');
}
// 返回指定字段
public function iphone_field(){
return $this->hasOne(Phones::class, function($builder){
$builder->where('phone_name', "苹果11");
$builder->fields("phone_name, user_id");
}, 'user_id', 'user_id');
}
当前内容版权归 EasySwoole 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 EasySwoole .