一直觉的ThinkPHP的关联操作很麻烦,所以遇到多对多的查询的时候我一般会直接在模型里自己写query。而对于一对多,或者一对一的查询操作再定义模型
去写query的话就未免太过麻烦。所以我直接在模型的基类里直接定义两个方法,当然也可以定义在自定义的类里面,以方便关联查询之用。
代码一:关联查询select的加强
1 /** 2 * 关联查询 3 * 简单的双表关联查询 4 * @param string $tableName 要关联的表名 5 * @param string $selectField 副表要查询的字段 可以使用 as 关键字 与原生态的sql语句一样 6 * @param string $VicetableField 副表的关联字段 7 * @param string $mainTableField 主表的关联字段 8 * @param string $relation 关联的关系 n:n 一对多一 n:m 多对多 默认n:m 9 * @return array 查询到的结果集 10 * @version 2013/4/18 19:11 11 */ 12 public function relationSelect($tableName,$selectField,$VicetableField,$mainTableField,$relation='n:m'){ 13 $result=$this->select(); 14 foreach ($result as $key=>$value){ 15 $query=$this->db->query("select {$selectField} from ".$this->tablePrefix.$tableName." where {$VicetableField} = {$value[$mainTableField]}"); 16 if($relation == 'n:n'){ 17 $result[$key][$tableName]=$query[0]; 18 }else{ 19 $result[$key][$tableName]=$query; 20 } 21 } 22 return $result; 23 }
示例:
1 //在操作里先实例化模型,这里使用Thinkphp的D函数,可以直接使用之前定义的方法 查询一对一的结果 2 $adminList=D('Admin')->relationSelect('admin_group','id,name as groupName','id', 'gid','n:n'); 3 //dump查看结果集 4 dump($adminList);
结果:
array(2) {
[0] => array(8) {
["id"] => string(1) "1"
["gid"] => string(1) "1"
["username"] => string(4) "root"
["password"] => string(35) "e10adc3949ba59abbe56e057f20f883e"
["email"] => string(18) "shench@outlook.com"
["realname"] => string(9) "XXX"
["logtime"] => string(1) "0"
["admin_group"] => array(2) {
["id"] => string(1) "1"
["groupName"] => string(15) "超级管理员"
}
}
[1] => array(8) {
["id"] => string(1) "2"
["gid"] => string(1) "1"
["username"] => string(6) "lichao"
["password"] => string(35) "e10adc3949ba59abbe56e057f20f883e"
["email"] => string(0) ""
["realname"] => string(6) "XXX"
["logtime"] => string(1) "0"
["admin_group"] => array(2) {
["id"] => string(1) "1"
["groupName"] => string(15) "超级管理员"
}
}
}
代码二:关联查询find的加强
1 /** 2 * 关联查询单条记录 3 * 简单的双表关联查询 4 * @param string $tableName 要关联的表名 5 * @param string $selectField 副表要查询的字段 可以使用 as 关键字 与原生态的sql语句一样 6 * @param string $VicetableField 副表的关联字段 7 * @param string $mainTableField 主表的关联字段 8 * @param string $relation 关联的关系 n:n 一对多一 n:m 多对多 默认n:m 9 * @return array 查询到的单条结果 10 * @version 2013/4/18 19:11 11 */ 12 public function relationFind($tableName,$selectField,$VicetableField,$mainTableField){ 13 //与上面的代码相比,这里用的是内置的find方法 因为返回的是一维数组,所以也不用遍历 14 $result=$this->find(); 15 $query=$this->db->query("select {$selectField} from ".$this->tablePrefix.$tableName." where {$VicetableField} = {$value[$mainTableField]}"); 16 if($relation == 'n:n'){ 17 $result[$key][$tableName]=$query[0]; 18 }else{ 19 $result[$key][$tableName]=$query; 20 } 21 return $result; 22 }
这第二段代码我就不做演示了。博主也是刚接触ThinkPHP不久,上面代码有什么问题或者可以改进的地方非常欢迎大家跟我讨论。
PS:看看我的园龄一年多了,没写什么东西,从今天起,我就写点什么吧。