2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

検索条件を指定して一覧を取得するには

Last updated at Posted at 2014-03-07

#概要

GETメソッドを用いて一覧を取得する方法をご紹介します。
まずは完成形から。

/table_name/list.html
<html>
  <head>
    <title>一覧取得サンプル</title>
  </head>
  <body>
    <form method="get">
      <h3>価格</h3>
      <input name="price__ge">円以上
      <input name="price__le">円以下
      <h3></h3>
      <input type="checkbox" name="or__color" value="black"><input type="checkbox" name="or__color" value="white"><input type="submit" value="検索">
    </form>
  </body>
</html>

ここに、特定条件を指定して[検索]ボタンを押したと仮定します。ここでの検索条件は1000円以上、5000円以下、色が黒または白です。
すると遷移先のURLは以下のとおりになります。

http://FQDN/table_name/list/?price__ge=1000&price__le=5000&or__color=black&or__color=white

この時、サーバー側で処理されるSQLは以下のとおりです。

list.sql
--発行されるSQL
SELECT *
  FROM table_name
 WHERE price >= 1000
   AND price <= 5000
   AND (color = 'black'
    OR  color = 'white');

#解説

##書式
パラメタ名は次のルールで指定することができます。

[or[_ {group_name} ]] {column_name} [ {operand} ]

##OR条件
各パラメタは通常AND条件として処理されますが、ORプリフィックスを利用することで
OR条件として処理することが可能です。
OR条件判定の指定方法は以下の2パターンがあります。

  • 同じ名称のカラムをORで連結する
  • 違う名称のカラムをグループ化してORで連結する

###同じ名称のカラムをORで連結する
同じカラムに対してOR条件を指定するにはORプリフィックスを含むパラメタを使用します。
宿泊数が2泊、または5泊以上のデータを抽出するためのパラメタは以下の通りです。

?or__stay_day=2&or__stay_day__ge=5

###違う名称のカラムをグループ化してORで連結する
別々のカラムに対してOR条件を指定することもできます。その場合は任意のグループ名称を付与して、どの条件群がOR連結となるかを指定します。
施設のうち、トイレ・更衣室・駐車場のいずれかが有るデータを抽出するためのパラメタは以下の通りです。

?or_g1__flg_toilet=true&or_g1__flg_dressingroom=true&or_g1__flg_parking=true

##オペランド
各パラメタがどのような比較演算子で条件判定されるのかは、
パラメタのサフィックスによって決定されます。
サフィックス用のデリミタはアンダースコア2つ __ です。

内容 指定例 展開例
オペランドなし 等しい col=1 col=1
ne 等しくない col__ne=1 col<>1
gt より大きい col__gt=1 col>1
ge 以上 col__ge=1 col>=1
lt より小さい col__lt=1 col<1
le 以下 col__le=1 col<=1
likel 前方一致 col__likel=abc col like 'abc%'
liker 後方一致 col__liker=abc col like '%abc'
like 部分一致 col__like=abc col like '%abc%'
nlikel 前方一致しない col__nlikel=abc col not like 'abc%'
nliker 後方一致しない col__nliker=abc col not like '%abc'
nlike 部分一致しない col__nlike=abc col not like '%abc%'
isnull 比較対象はNULL値 col__isnull= col is null
isnotnull 比較対象はNULL値ではない col__isnotnull= col is not null
in 要素のいずれかに等しい col__in=1&col__in=2 col in (1,2)
nin 要素のいずれにも等しくない col__nin=1&col__nin=2 col not in (1,2)

#セキュリティ
製作者の意図しない任意のパラメタが指定されないように、GENERATORはURLごとに指定可能なパラメタ名のリストを管理します。最初の例であれば、次のようなリストがサーバーに保持されます。

URLパターン 許可するGETパラメタ
/table_name/list prige__ge
price__le
or__color

このリストにないパラメタが検索条件として指定されたとしても、それはSQL生成には関係しません。単純に無視されます。


##注意事項

  • テーブル定義を行う際、 or_ から始まるカラム名を定義することはできません。
  • table_nameをURLパターンに含めるルールは暫定です。今後変更になる可能性があります。

##関連項目

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?