当前位置

Drupal网站Views无法实现的查询用SQL语句完成

James Qi 在 2018年1月22日 - 22:58 提交
内容摘要:Drupal网站的Views功能相对强大,特别是对于SQL不太熟悉的朋友来说Views的Web界面非常方便,而且数据库查询功能一点不弱,用Drupal这么多年了不能用Views实现的查询功能极少极少,......

  Drupal网站的Views功能相对强大,特别是对于SQL不太熟悉的朋友来说Views的Web界面非常方便,而且数据库查询功能一点不弱,用Drupal这么多年了不能用Views实现的查询功能极少极少,但也还是存在用Views不好实现的场景,例如我遇到的:

  • 跨站之间的查询之一,用Views只能查询同一个Drupal网站内的表,我当时只好用SQL语句来实现需要的查询;
  • 跨站之间的查询之二,不使用同一台数据库服务器的情况,或者不是两个同类型的网站,例如一个是微信小程序,一个是Drupal网站,这时可以用Json数据的API调用来解决,当然提供Json数据的Drupal网站还是可以用Views来实现Json数据的输出;
  • 比较少见的记录数据,例如“IP地址查询”中需要判断变量所在的数据库记录范围段,用Views勉强可以实现变量比较,但不够灵活、效率也低,后来采用了读取文件中的文本数据进行对比的办法,完全抛弃了数据库;
  • 比较少见的条件查询,例如“国语小字典”中需要做“拼音索引”,而遇到多音字的情况下,拼音字段就可能包含多个拼音,中间用空格分隔,尝试了用Views但怎么也没搞出来。

  后来与同事商量后,用SQL语句才解决,源代码如下:

......
$output = '';
$fields = '`danzi`,`pinyin`,`pinyinqushengdiao`,`zhuyin`';
$table = 'dict_mini';
$sql = "SELECT $fields FROM $table WHERE `pinyinqushengdiao` = '$pinyin' or `pinyinqushengdiao` like '$pinyin %' or `pinyinqushengdiao` like '% $pinyin %' or `pinyinqushengdiao` like '% $pinyin'";
$query = db_query($sql);
$result = $query->fetchAll();
$output .= "<table>\n";
$output .= "<tr><th>序號</th><th>單字</th><th>拼音</th><th>拼音(無聲調)</th><th>注音</th></tr>\n";
foreach ($result as $key => $value) {
  $danzi = $value->danzi;
  $pinyin = $value->pinyin;
  $pinyinqushengdiao = $value->pinyinqushengdiao;
  $zhuyin = $value->zhuyin;
  $url = l($danzi,"danzi/$danzi");
  $number = $key + 1;
  $output .= "<tr><td>$number</td><td>$url</td><td>$pinyin</td><td>$pinyinqushengdiao</td><td>$zhuyin</td></tr>\n";
}
$output .= "</table>\n";
return $output;
......

  这段代码实现的效果请看“拼音: he”,无论拼音he是单音字的唯一拼音还是多音字的多个拼音之一(位于前中后都可以),上面红色的SQL语句是关键,可以看出Where条件中列出了4种可能,这在Drupal的Views里面还真不好实现。

  以前刚用MediaWiki和Drupal的时候,对MySQL、PHP都还不太了解,现在逐步了解了,确实不用都是用Drupal或第三方扩展程序提供的现成构架,某些复杂情况下直接用PHP代码、SQL语句来实现更简单高效。

自由标签: