TP5.1 浅谈一对一关联(withJoin)
最近在研究tp5.1的框架,刚从tp3.2摸索过来,然后打算好习惯从头养起嘛,所以近期的代码都比较按照文档来。
奈何!啊 奈何!tp的文档总是那么那么的简介,每次出问题,找个案例都找不全,总是寄托到百度,寻找那些老前辈的博客,期望能找到解决自己问题的案例。所以这也算我这篇博文的由来原因吧,我博文更新的也没有任何规律顺序可言,就像我在我第一篇博文中写的,就当做自己的一个笔记吧,遇到什么问题就更什么问题,也不系统的整理 一个系统之类的了。
https://www.kancloud.cn/manual/thinkphp5_1/354057 这是TP5.1一对一关联的看云文档,其实文档中说的很全面,只是我感觉实际例子很少,所以我再浅谈一下我自己遇到的问题。哈哈哈,啰啰嗦嗦,上正文:
1、 试卷表(paper) 题库表(stock) 试卷表中含有题库id (stock_id)
现需要,在paper控制器里读取试卷列表并将题库表titlle字段显示,这就用到了关联。
/**
*试卷控制器
*/
use app\common\model\Paper as PaperModel;
class Paper extends Auth
{
/**
* 列表
*/
public function index(){
$model=new PaperModel();
$lists=$model->withJoin('stock')->select();
$this->assign('lists',$lists);
return $this -> fetch();
}
}
/**
* 试卷模型
*/
<?php
namespace app\common\model;
class Paper extends Base {
public function stock()
{
return $this->belongsTo('stock');
}
}
这是最简单的一个应用,其中试卷控制器中withJoin(‘stock’) 这里的stock对应的是模型里的方法名 ;模型中belongsTo(‘stock’)这里的stock对应的是数据库中的表名 ;切记,不要搞混哦。
2、 现有:试卷表(paper) 、用户表(member) 、做题记录表(answer_log) 做题记录表中含有用户id (member_id)和试卷id(paper_id)
现需要,在做题记录的控制器里读取做题记录列表并显示用户名称和试卷标题,这就也得关联了。
这是三个表的情况,也不需要使用多对多关联,使用withJoin也能解决关联情况,当然是解决了我的问题,倘若您的问题复杂,不适用这种情况,请您自行解决,勿怪。
/**
*做题记录控制器
*/
use app\common\model\AnswerLog as AnswerLogModel;
class AnswerLog extends Auth
{
/**
* 列表
*/
public function index(){
$model=new AnswerLogModel();
$lists=$model->withJoin(['member','paper'])->select();
$this->assign('lists',$lists);
return $this -> fetch();
}
}
/**
* 做题记录模型
*/
<?php
namespace app\common\model;
class AnswerLog extends Base {
/**
* 用户与试卷 多对多关系 用户可以做多个试卷 试卷也可以被多个用户做
* @return
* member表 paper表 中间表是answerLog 表
*/
public function member()
{
return $this->belongsTo('member');
}
public function paper()
{
return $this->belongsTo('paper');
}
}
这个例子是TP文档中没有明显写出的,只有这句话:
需要注意的是withJoin方式不支持嵌套关联,通常你可以直接传入多个需要关联的模型。
于是大胆实验,在做题记录控制器withJoin([‘member’,‘paper’]) 中传入数组
其中 member与paper对应的还是模型里的方法名 ;所以模型中包含function member()、function paper()两个方法。
而两个方法中belongsTo()里的参数才是对应的数据库中的表名。
这里只是我遇到的两个简单的问题,具体问题还得具体分析,吐槽归吐槽,更详细的内容还是离不开文档的,只要你肯动脑 肯动手,总会能解决问题的。加油吧打工人!