首页 > Web开发 > 详细

THINKPHP_(2)_TP模型的多表关联查询和多表字段的关键字搜索。

时间:2021-06-01 00:35:13      阅读:27      评论:0      收藏:0      [点我收藏+]

问题:

技术分享图片

 

上述内容中,标题和学年属于一个数据表。分类则属于另外一个数据表,并且是利用id关联后,另外一个数据表中的title字段。

需要设置关键字搜索,实现多表关联查询和多表字段的关键字搜索。

解决方法:

编写如下代码:

    public function search($srcfrom)
    {
        // 整理变量
        $src = [
            ‘category‘ => ‘‘
            ,‘searchval‘ => ‘‘
            ,‘status‘ => ‘‘
            ,‘bfdate‘ => ‘‘
            ,‘enddate‘ => ‘‘
        ];
        $src = array_cover($srcfrom, $src) ;
        if(isset($srcfrom[‘bfdate‘]) && strlen($srcfrom[‘bfdate‘]) > 0)
        {
            $src[‘bfdate‘] = $srcfrom[‘bfdate‘];
        }else{
            $src[‘bfdate‘] = date("Y-m-d", strtotime("-6 year"));
        }
        if(isset($srcfrom[‘enddate‘]) && strlen($srcfrom[‘enddate‘]) > 0)
        {
            $src[‘enddate‘] = $srcfrom[‘enddate‘];
        }else{
            $src[‘enddate‘] = date("Y-m-d", strtotime(‘4 year‘));
        }

        // 查询数据
        $data = $this
            ->whereTime(‘bfdate|enddate‘, ‘between‘, [$src[‘bfdate‘], $src[‘enddate‘]])
//            ->alias("c")
            ->withJoin(
//                "glCategory"
                [
                    ‘glCategory‘=>function($query){
                        $query->field(‘id, title‘);
                    },
                ]
            )
            ->when(strlen($src[‘searchval‘]) > 0, function($query) use($src){
                $query->where("xueqi.title|glCategory.title|xuenian", ‘like‘, ‘%‘ . $src[‘searchval‘] . ‘%‘);
                })
            ->when(strlen($src[‘category‘]) > 0, function($query) use($src){
                    $query->where(‘category‘, $src[‘category‘]);
                })
            ->when(strlen($src[‘status‘]) > 0, function($query) use($src){
                    $query->where(‘status‘, $src[‘status‘]);
                })
//            ->with(
//                [
//                    ‘glCategory‘=>function($query){
//                        $query->field(‘id, title‘);
//                    },
//                ]
//            )
            ->select();

        file_put_contents(‘D:\log.txt‘,$this->getLastSql());

        return $data;
    }

在上述搜索中,我们利用withJoin进行关联。同时,利用

$query->where("xueqi.title|glCategory.title|xuenian", ‘like‘, ‘%‘ . $src[‘searchval‘] . ‘%‘);

这里的易错点:

当关联多表进行关键字搜索的时候,当前表和关联表都有title字段。我们在写sql语句的时候,会直接用title和glCategory.title进行区分。

但是在tp的世界里,必须注明模型xueqi.title(model的类名叫Xueqi,但是在where中,用首字母小写的xueqi即可)。

同时,对于没有多表重复的xuenian子弹,我们不需要注明xueqi。这也是sql和tp模型的一些不同之处。

 

THINKPHP_(2)_TP模型的多表关联查询和多表字段的关键字搜索。

原文:https://www.cnblogs.com/xiaojieshisilang/p/14833635.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!