zoukankan      html  css  js  c++  java
  • THINKPHP_(2)_TP模型的多表关联查询和多表字段的关键字搜索。

    问题:

    上述内容中,标题和学年属于一个数据表。分类则属于另外一个数据表,并且是利用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模型的一些不同之处。

    你永远不知道未来会有什么,做好当下。技术改变世界,欢迎交流。
  • 相关阅读:
    消息(5)——WSE增强的web服务套件,MTOM附件
    消息(4)——WS附件传输,包体中的base64编码附件
    WCF消息之XmlDictionaryWriter
    Aptana使用技巧—Aptana2.0系列教程
    [f]获取URL中的参数[转]
    [f]获取元素在页面的位置getPos
    手机wap2.0网页缩放设置
    WPF SnapsToDevicePixels作用
    Silverlight获取控件绝对位置
    浏览器: F5 和 Ctrl+F5的区别
  • 原文地址:https://www.cnblogs.com/xiaojieshisilang/p/14833635.html
Copyright © 2011-2022 走看看