1

検索オプションを備えた 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_fieldcompanynamecompanynameますsearch_field。これを達成するためにアドバイスしてください。

4

1 に答える 1

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();
?>
于 2013-05-05T02:32:09.950 に答える