ThinkPHP5.1 中的联表查询(下)
此时我们先创建出这个Dao
<?php
namespace app\dao;
class StudentDao{
}
然后再构建这个复杂的数据模型
//构建复杂的数据模型
private function getRamodel(){
$model = app()->make(Student::class);
$classModel = app()->make(Clas::class)->getName();
$hobbyModel = app()->make(Hobby::class)->getName();
return $model->alias('s')
->join($classModel . ' ' . 'c', 's.class_id =c.id', 'LEFT')
->join($hobbyModel . ' ' . 'h', 'h.student_id =s.id', 'LEFT')
;
}
然后就可以指定数据获取的方法
public function getList($where){
$obj = $this->getRaModel();
return $obj->where($where)->select();
}
然后上层就可以进行数据拉取了
$data = app()->make(StudentDao::class)->getList([]);
return json($data);
这是中大型项目提取复杂数据模型非常重要的一个思路,创建完成的复杂数据模型可以在多端通用。而且保证每一端拉取的数据结构都是相同的
下面我们继续完成上面的那个需求
指定需要查询的数据字段
$fileld = 's.name as stu_name,s.age as stu_age,c.name as cla_name,h.name as hob_name';
拉取到数据
补充where的查询条件
$where = [ ['c.name','=','小二班'],
['s.age','>',5],
['h.name','=','画画'],
];
完整的dao的代码如下:
<?php
namespace app\dao;
use app\model\Hobby;
use app\model\Student;
use app\model\Clas;
class StudentDao{
private function getRamodel(){
$model = app()->make(Student::class);
$classModel = app()->make(Clas::class)->getName();
$hobbyModel = app()->make(Hobby::class)->getName();
return $model->alias('s')
->join($classModel . ' ' . 'c', 's.class_id =c.id', 'LEFT')
->join($hobbyModel . ' ' . 'h', 'h.student_id =s.id', 'LEFT')
;
}
public function getList(){
$fileld = 's.name as stu_name,s.age as stu_age,c.name as cla_name,h.name as hob_name';
$where = [
['c.name','=','小二班'],
['s.age','>',5],
['h.name','=','画画'],
];
$obj = $this->getRaModel();
return $obj->field($fileld)->where($where)->select();
}
}
controller或者是service中进行调用
<?php
namespace app\index\controller;
use app\dao\StudentDao;
class Index
{
public function index()
{
$data = app()->make(StudentDao::class)->getList([]);
return json($data);
}
}
码字不易,每一句话,每一个字都是修修改改的,但愿对你有所帮助。Bye~