您的位置:首页 > 编程语言 > PHP开发

Thinkphp关联模型使用field或getField函数

2016-04-08 21:24 661 查看
最近写个人项目,遇到个小坑——Thinkphp关联模型使用field或getField函数时必须包含relation_foreign_key,否则无法关联。

话不多说,看代码:

<?php
namespace Project\Model;

use Think\RelationModel;

class ProjectModel extends RelationModel
protected $_link = array(
// 与ProjectList关联(一对多:HAS_MANY)
'List' => array(
'mapping_type' => self::HAS_MANY,
'class_name' => 'ProjectList',
'mapping_name' => 'List',
'foreign_key' => 'pid',
'relation_foreign_key' => 'id',
'mapping_fields' => 'id,title',
),
// 与ProjectCard关联(一对多:HAS_MANY)
'Card' => array(
'mapping_type' => self::HAS_MANY,
'class_name' => 'ProjectCard',
'mapping_name' => 'Card',
'foreign_key' => 'pid',
'relation_foreign_key' => 'id',
'mapping_fields' => 'id,list_id,title,order',
),
);

public function getProject($id)
{
//省略其余代码

$projectInfo = $this->relation(array('List', 'Card'))->field('title,summary')->where(array('id' => $id, 'status' => 1))->find();

//省略其余代码
}
}


此时var_dump($projectInfo)的结果是

array (size=4)
'title' => string '123123' (length=6)
'summary' => string '1231231231231231231' (length=19)
'List' =>
array (size=0)
empty
'Card' =>
array (size=0)
empty


查看thinkphp自带的调试工具,发现sql是这样的:



刚开始还以为是$_link中那个地方写错了,找了半天,后来想想应该是没有关联上,在field函数中加上relation_foreign_key就行了(本文中是id),修改后的查询代码如下:

$projectInfo = $this->relation(array('List', 'Card'))->field('id,title,summary')->where(array('id' => $id, 'status' => 1))->find();


此时thinkphp的调试工具:



getField函数是跟field函数同理的,就不再赘述。

总结:

使用框架确实开发速度快了很多,但不可避免的也会有些小坑,找出来解决掉还是挺有意思的。目前,还没仔细看thinkphp关于这部分的源码,如能改进将会把思路和代码后补上。

水平有限,欢迎指正~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: