0

PHP の CodeIgniter に Datamapper 1.8.1-dev を使用して、このクエリを作成して、リストの一番上にある 1 つの国名に優先順位を付けようとしています。

SELECT * FROM countries
ORDER BY CASE name WHEN 'Australia' THEN 1 ELSE 2 END, name

私の国のモデル(Datamapperを拡張する)のPHP:

$countries = new Country();
$countries->order_by("CASE name WHEN 'Australia' THEN 1 ELSE 2 END, name");
$countries->get_iterated();

代わりに、Datamapper は "CASE" をテーブル名として解析し、次の構文エラー クエリを作成します。

SELECT * FROM (`countries`)
ORDER BY `CASE` name WHEN 'Australia' THEN 1 ELSE 2 END, `countries`.`name`

このフロー制御ステートメントは MySQL 5 に追加されたばかりなので、CASE ケースは処理されていないと思いますか? order_byテーブルに列を追加するか、countriesデータベースの取得後に PHP の並べ替え関数を使用する唯一の方法はありますか?

4

3 に答える 3

5

order by で case ステートメントを使用できました。case ステートメントを括弧で囲むだけです。そうしないと、大文字と小文字が列名として扱われ、逆引用符で囲まれます。

$this->db->distinct(); 
$this->db->select('country');         
$this->db->from('distributors');
$this->db->where('country  != ', '');
$this->db->order_by("(CASE country WHEN 'UNITED STATES OF AMERICA' THEN '1' ELSE country END)");
于 2012-12-19T15:27:46.133 に答える
1

Datamapper のorder_by()は単なるエイリアスです$this->db->order_by()

残念ながら、CodeIgniter Documentationによると、データベース クラスは拡張不可能な唯一のものです。コアを変更して手を汚す必要があります。

関数に向かいsystem/database/DB_active_rec.php、検索しorder_by()ます。関数の関数定義に 3 番目のパラメーターを追加します。

function order_by($orderby, $direction = '', $case = null)

$orderby_statement関数の一番下までスクロールします...を$this->ar_orderby[]書き込む直前に:

if($case===true) $orderby_statement = "CASE " . $orderby_statement;

ファイルを保存しapplication/libraries/datamapper.php、関数に移動して検索しorder_by()ます。注意してください、これはただのラッパーです!

それを次のように置き換えます。

public function order_by($orderby, $direction = '', $case = null)
{
    $this->db->order_by($this->add_table_name($orderby), $direction, $case);
    //For method chaining
    return $this;
}

ここで、コントローラーで にtrue3 番目のパラメーターとして渡しorder_by()、最初の文字列パラメーターから CASE キーワードを削除すると、正しい構文が得られるはずです。

お役に立てれば。

于 2012-08-06T02:27:44.387 に答える
0

DataMapperはMYSQLのCASEキーワードをサポートしていないため、直接的な解決策は、次のquery()メソッドを使用してSQLを呼び出すことです。

$sql = "SELECT * FROM `countries` ORDER BY CASE `name` WHEN 'Australia' THEN 1 ELSE 2 END, `name`";
$countries = new Country();
$countries->query($sql);
于 2012-08-17T06:46:35.620 に答える