thinkphp5模型关联1对多 自定义主键

一个用户对应多条积分记录,我们要实现的就是查询某个用户,获取用户所有或部分的积分记录。

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);
    }

输出:

1array(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"
  }
}

23输出格式一致:
array(1) {
  [0]=>
  array(21) {
    ["id"]=>
    int(1)
    ["openid"]=>
    string(28) "oxo_g0TwiNqW7SStoy-j7lBxGcBc"
    ["nickname"]=>
    string(1) "."
  }
}

4array(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)
      }
    }
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值