一个用户对应多条积分记录,我们要实现的就是查询某个用户,获取用户所有或部分的积分记录。
1,用户表:
CREATE TABLE `wx_user` (
`id` int(10) AUTO_INCREMENT COMMENT 'ID',
`openid` char(28) COMMENT 'openid',
`nickname` varchar(255) COMMENT '用户昵称',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `openid`(`openid`) USING BTREE
) ENGINE = InnoDB COMMENT = '微信用户表';
,2,积分记录表:
CREATE TABLE `score_record` (
`id` int(10) AUTO_INCREMENT COMMENT 'ID',
`openid` char(28) DEFAULT '' COMMENT '用户',
`score` int(8) COMMENT '积分值',
`note` varchar(100) COMMENT '备注',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB COMMENT = '积分记录表';
3,新建用户模型【我的用户表中间有下划线,所以这里模型名下划线后的第一个字母要大写】。hasMany(‘关联模型’,‘外键’,‘主键’)。方法scoreRecord名(开头小写)是可以自定义的,不过建议定义和要关联的模型同名,方便应用。 这里有一点要特别注意【默认外键名为当前模型数据表拼接‘_id’,所以应该是‘wx_user_id’,且外键必须是当前模型关联数据表的主键。这里使用的是openid作为外键,所以必须使用$pk定义主键】
<?php
namespace app\index\model;
use think\Model;
class WxUser extends Model
{
protected $pk = 'openid';
public function scoreRecord()
{
return $this->hasMany('ScoreRecord','openid');
// 如果要是想实现分页,可以这样实现
return $this->hasMany('ScoreRecord','openid')->limit(1,10);
}
}
而且必须新建score_record表的关联模型
<?php
namespace app\index\model;
use think\Model;
class ScoreRecord extends Model
{
}
4,调用输出,这里展示了几种基本调用方法,类名订单和引用模型就不展示了
public function scoreRec($openid='')
{
$model = new WxUserModel();
// 1,仅获取score_record表记录
$data = $model->scoreRecord()->where('openid',$openid)->field('id,openid,score,note')->order('id desc')->select()->toArray();
// 2,查询记录超过3个的用户
$data = $model::has('scoreRecord','>',3)->select()->toArray();
// 3,查询积分为10的用户
$data = WxUserModel::hasWhere('scoreRecord',['score'=>10])->select()->toArray();
// 4,关联获取
$data = WxUserModel::with('scoreRecord')->field('id,openid,nickname')->where('openid',$openid)->select()->toArray();
echo "<pre />";
var_dump($data);
}
输出:
1:
array(4) {
[0]=>
array(4) {
["id"]=>
int(4)
["openid"]=>
string(28) "oxo_g0TwiNqW7SStoy-j7lBxGcBc"
["score"]=>
int(10)
["note"]=>
string(19) "领取任务成功4"
}
[1]=>
array(4) {
["id"]=>
int(3)
["openid"]=>
string(28) "oxo_g0TwiNqW7SStoy-j7lBxGcBc"
["score"]=>
int(10)
["note"]=>
string(19) "领取任务成功3"
}
}
2和3输出格式一致:
array(1) {
[0]=>
array(21) {
["id"]=>
int(1)
["openid"]=>
string(28) "oxo_g0TwiNqW7SStoy-j7lBxGcBc"
["nickname"]=>
string(1) "."
}
}
4:
array(1) {
[0]=>
array(4) {
["id"]=>
int(1)
["openid"]=>
string(28) "oxo_g0TwiNqW7SStoy-j7lBxGcBc"
["nickname"]=>
string(1) "."
["score_record"]=>
array(4) {
[0]=>
array(7) {
["id"]=>
int(1)
["openid"]=>
string(28) "oxo_g0TwiNqW7SStoy-j7lBxGcBc"
["score"]=>
int(10)
["note"]=>
string(19) "领取任务成功1"
["about_id"]=>
int(1)
["create_time"]=>
int(1597299698)
["wx_user_id"]=>
int(1)
}
}
}
}