牛骨文教育服务平台(让学习变的简单)
博文笔记

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

创建时间:2016-04-08 投稿人: 浏览次数:858

最近写个人项目,遇到个小坑——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是这样的:
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关于这部分的源码,如能改进将会把思路和代码后补上。

水平有限,欢迎指正~

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。