场景:
有一个饭店表 restaurant,存放所有饭店记录。我需要一个功能,将饭店按照不同的条件进行多重查询。就象这样:
氛围:浪漫 / 商务会谈 / 茅草屋
菜系:川菜 / 鲁菜 / 家常菜...
区域:东区 / 西区 / 南区 / 北区...
我点击一个或多个条目,则下方自动刷出符合条件的饭店来。
例如我点击了 浪漫、商务会谈、鲁菜,由于浪漫、商务会谈是同属于氛围的,应该认为用户想查找的是“或”的关系,不管出现二者的哪一个,都属于查询范围;而鲁菜是属于菜系的,那么与前两个条件来说,应该是“与”的关系,即:用户想查(氛围==浪漫 || 氛围==商务会谈)&& (菜系==鲁菜)的所有饭馆的集合。
这里有一个逻辑上的小别扭:如果我氛围选了浪漫,菜系不选,那么是不是要选择(氛围==浪漫)&& (菜系==none)吗?这样的结果肯定为空。实际上,不选菜系表示对菜系无要求,所以范围应该是(氛围==浪漫)&& (菜系==所有)。
考虑到这个功能比较常见,打算做一个通用的东西出来
感觉这是个难度比较大的功能,来做一下吧。
1、建立几个表:tag_tablename、tag_title、tag_text、tag_refer。其中
tag_tablename - 在这里只有一条记录 restaurant,但将来可能会有其它的,如article、user等
tag_title - 这是大的分类,分别为氛围、菜系、区域,每一条的tablename_id为1,即restaurant
tag_text - 这是具体的tag,如浪漫、川菜、鲁菜、东区。。等等
tag_refer - 这是一个多对多的表,它记录了restaurant表中的记录与tag_text表中的记录的多对多的对应关系
2、创建 Model。这里,TagTablename里实现了tag_titles,TagTitle里面实现了tag_texts。
3、写实现的类 CAnjoTag
    // 生成://     氛围:浪漫 / 商务会谈 / 茅草屋...//     菜系:川菜 / 鲁菜 / 家常菜...//     区域:东区 / 西区 / 南区 / 北区...// 这样的样式,并且最好能接受点击,并且最好在点击后调用ajax更新下面的查询结果public static function tag_list($tablename, $options=array()) {$r='  <ul class="select">';。。。return $r;}

这里面的具体实现就不贴出来了,主要是一步步生成html代码,显示前面的那些内容,并接受点击,点击一次选择,再次点击则取消选择。点击会触发一个javascript函数,它回调另一个javascript函数,用以 Ajax 方式更新查询区域的内容。
然后,这样调用和更新ajax获取的内容
<?php echo CAnjoTag::tag_list('Restaurant', array('click_callback'=>'tag_clicked')); ?>
<script>
function tag_clicked(ids)
{// console.log(ids);$('#rest-grid').load('?r=rest/ajaxAction&action=rest_query', {tagtext_ids: ids});
}
</script>

在RestController中这样实现:
    public function actionAjaxAction($action){$r='';switch ($action){case 'rest_query':$ids=Yii::app()->request->getParam('tagtext_ids');if (substr($ids, -1)==',') $ids=substr($ids, 0, -1); //删除结尾的 ,$ids=trim($ids);if ($ids!=''){$cond="id in (select record_id from {{tag_refer}} where tag_text_id in ($ids))";$criteria = new CDbCriteria;$criteria->condition=$cond;$count = Restaurant::model()->count($criteria);$pager = new CPagination($count);$pageSize=10;$pager->params = array('tagtext_ids'=>$ids, 'action'=>'rest_query');//分页中添加其他参数$pager->pageSize=$pageSize;$pager->applyLimit($criteria);$dataProvider=new CActiveDataProvider('Restaurant', array('criteria'=>$criteria,'sort'=>array('defaultOrder'=>'id desc',),'pagination'=>$pager,));$this->renderPartial('_query_result', array('dataProvider'=>$dataProvider));die();}break;}echo $r;}

4、ajax换页问题
调试ajax换页时费了很大劲。总是做不到按Ajax方式显示下一页,一点页码的链接就跳到新页上了。看一下console的错误信息,不能ajax调用的原因是在 jquery.yiigridview.js 中,出现了错误:
$.param.querystring is not a function
网上解释说:这个错误会导致你无论怎么选择filter,都不会发送请求道cintroll去取数据,解决办法就是,无论在什么地方调用jquery,最好使用Yii的registe来注册,而不要使用<script>来引入.
<?php Yii::app ()->clientScript->registerCoreScript ( 'jquery' ); ?>
但bootstrap提示,
Uncaught Error: Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 3
于是找到 Yii的核心script所在的位置:
D:\xampp\htdocs\yii-1.1.14.f0fee9_201505\framework\web\js\source
这个jquery.js 是1.8.3的,我复制了一个1.11.3的进来,一切正常了。
这个jquery的问题,真的要改变习惯了。以前也会因为jquery的多次引用而造成类似的这种莫名其妙的错误,试着改变jquery的位置或显式地引用一下它,有时也能解决,但终归不是正途。
(另:看了 jquery.yiigridview.js的源码,原来是Yii的作者写的。真牛~前端也很强嘛)
5. 待改进:
在actionAjaxAction中,$cond="id in (select record_id from {{tag_refer}} where tag_text_id in ($ids))"; 这个写法是不严谨的。它把所有的条件都当做“或”来处理了,没有实现前面分析的结论。这是小问题,以后再细细实现。
另一个是,在饭店信息的修改界面,我需要调用 CAnjoTag 的另一个方法,显示饭店的相关tag属性并可以修改。这同样是我的初衷之一,下一步会去做。

转载于:https://www.cnblogs.com/anjo/p/5917616.html

用YII实现多重查询(基于tag)相关推荐

  1. php with语法,Yii框架关联查询with用法分析

    本文实例分析了Yii框架关联查询with用法.分享给大家供大家参考.具体方法如下: Yii框架关联查询与mysql中的关联查询会有什么区别呢?这里小编就与各位来一起来看看吧. Yii的关联查询确实是一 ...

  2. yii mysql条件查询_Yii框架where查询用法实例分析

    本文实例讲述了Yii框架where查询用法.分享给大家供大家参考,具体如下: 1.简述 Yii的查询操作找使用where用的很多 总结下常用的哈希格式与操作符格式 2.操作符格式 适用于操作符的 [操 ...

  3. Jenkins+Gitlab+Nginx+Maven编译Java项目自动发布与基于tag版本回退(重复构建问题已解决)

    实现流程: 手动部署Java项目至后端Web集群 1.搭建Nginx+Tomcat集群架构. 2.开发提交Java源代码至Gitlab仓库. 3.手动获取Java源代码,然后使用Maven进行编译. ...

  4. SpringBoot实现1对1、1对多、多对多关联查询——基于SpringBoot和Vue的后台管理系统项目系列博客(十八)

    系列文章目录 系统功能演示--基于SpringBoot和Vue的后台管理系统项目系列博客(一) Vue2安装并集成ElementUI--基于SpringBoot和Vue的后台管理系统项目系列博客(二) ...

  5. SpringBoot实现分页查询——基于SpringBoot和Vue的后台管理系统项目系列博客(七)

    系列文章目录 系统功能演示--基于SpringBoot和Vue的后台管理系统项目系列博客(一) Vue2安装并集成ElementUI--基于SpringBoot和Vue的后台管理系统项目系列博客(二) ...

  6. mysql怎么多重查询_mysql基于值的多重查询

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  7. Yii AR Model 查询

    Yii AR很好很强大,但刚开始不知道怎么使用 如果英文不错,可以直接看原文地址http://www.yiiframework.com/doc/guide/1.1/en/database.ar 下面是 ...

  8. yii多表查询--学习随笔

    今天自己做一个小demo,为了不要冗余字段,需要进行多表联合查询.搜索 yii中,用model来映射数据库(其实好多框架都是这么搞的),一个模型类通常有一个search模型类跟着一起 废话不多说了,首 ...

  9. php yii多表查询

    一个Company记录可以对应多个CompanyUser纪录 Company表: [['id', 'nature_id', 'scale_id', 'pro_id', 'created_at', 'u ...

最新文章

  1. python集合数据对象_python学习第七天 基础数据类型补充 深浅copy 集合 关键字后面加可迭代对象...
  2. php 中数组的定义赋值吗,怎么在php中定义一个数组
  3. 【HDOJ】3315 My Brute
  4. 华为ensp的缺省_华为模拟器 eNSP安装教程
  5. linux下如何升级gcc和g++编译器
  6. Java 实例 - 查找 List 中的最大最小值
  7. express-art-template模板引擎(详细)
  8. OpenJDK8 272在MIPS上的编译修改记录
  9. 《企业IT架构转型之道-阿里巴巴中台战略思想与架构实战》笔记
  10. 网线制作实验相关内容
  11. gyp ERR! stack Error: Can't find Python executable python, you can set the PYT HON env variable.
  12. 毕业设计-校园招聘系统
  13. 将titles_test表名修改为titles_2017
  14. springSecurity 登陆失败前台显示账号密码登录错误
  15. 中间视频上下图片的视频效果怎么制作
  16. 字符串匹配,从BF 到 RK 到 KMP
  17. C++源代码单词扫描程序(词法分析)
  18. 【枚举算法】佩尔方程
  19. 电脑xp传照片显示服务器错误,xp系统显示“服务器错误500”的两种解决方法
  20. 宝马与F团合作能否再造营销奇迹?

热门文章

  1. 第四章 SQL*plus介绍、常用命令
  2. python123子字符串输出_Python--字符串函数方法全解
  3. php大于等于符号怎么打出来_PHP常用的特殊运算符号(连续小于符号,三个小于符号,eot,eod,echo示例,print示例)...
  4. 凯盛机器人_机器人登场!水泥发运告别人工,粉尘危害降至最低
  5. Zabbix服务器性能优化记录
  6. 计算机网络:Socket网络通信底层数据传输
  7. jquery text html width heigth的用法
  8. 消息队列如何保证顺序性?
  9. web嵌入到原生的app里需要注意的事项
  10. kafka shell