我有一个带有搜索选项的drupal网站。如果用户输入搜索关键字,我需要将其与多个列进行比较并显示记录。
我尝试了以下查询
$search = 'test';
$sql_query = db_select('logoinfo', 'l')->fields('l');
$or = db_or();
$or->condition('search_field', '%'.db_like($search).'%','LIKE');
$or->condition('companyname', '%'.db_like($search).'%','LIKE');
$sql_query->condition($or);
$selectlogos = $sql_query->execute();
它显示与搜索关键字匹配的所有记录,其顺序为自动增量ID asc。
但我希望首先显示记录,其中search_field
和companyname
与关键字匹配,之后其他记录与companyname
或{{1}匹配}。请告知实现此目的。
答案 0 :(得分:1)
由于orderBy需要字段名称且无法按表达式排序,因此您需要使用addExpression获取别名,然后按该别名排序。如果值不在两个字段中,则我的示例中的表达式将返回0,如果它在两个字段中,则返回1。据我所知,这应该是标准的SQL,但它可能因不同的数据库后端而异;因此可能需要根据您使用的数据库调整表达式。
<?php
$search = 'test';
$sql_query = db_select('logoinfo', 'l')->fields('l');
$or = db_or();
$or->condition('search_field', '%'.db_like($search).'%','LIKE');
$or->condition('companyname', '%'.db_like($search).'%','LIKE');
$sql_query->condition($or);
$safe_search = db_like($search);
$ex_alias = $sql_query->addExpression("l.search_field LIKE '%$safe_search%' AND l.companyname LIKE '%$safe_search%'");
$sql_query->orderBy($ex_alias, 'DESC');
$selectlogos = $sql_query->execute();
?>