Thinkphp关联模型使用field或getField函数
最近写个人项目,遇到个小坑——Thinkphp关联模型使用field或getField函数时必须包含relation_foreign_key,否则无法关联。
话不多说,看代码:
<?php
namespace ProjectModel;
use ThinkRelationModel;
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关于这部分的源码,如能改进将会把思路和代码后补上。
水平有限,欢迎指正~
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。