|
|
|
@ -3,7 +3,7 @@
|
|
|
|
|
|
|
|
|
|
> Note|注意: この節はまだ執筆中です。 |
|
|
|
|
|
|
|
|
|
[データベースの基礎](db-dao.md) の節で説明したように、Yii は基本的なデータベースアクセスレイヤを提供します。 |
|
|
|
|
[データベースの基礎](db-dao.md) の節で説明したように、Yii は基本的なデータベースアクセスレイヤを提供しています。 |
|
|
|
|
このデータベースアクセスレイヤは、データベースと相互作用するための低レベルな方法を提供するものです。 |
|
|
|
|
それが有用な状況もありますが、生の SQL を書くことは面倒くさく、間違いを生じやすいものでもあります。 |
|
|
|
|
これに取って代る方法の一つがクエリビルダを使用することです。 |
|
|
|
@ -78,11 +78,11 @@ $query->select(['id', 'name'])
|
|
|
|
|
|
|
|
|
|
> Info|情報: `SELECT` 句が SQL 式を含む場合は、常に配列形式を使うべきです。 |
|
|
|
|
> これは、`CONCAT(first_name, last_name) AS full_name` のように、SQL 式がカンマを含みうるからです。 |
|
|
|
|
> そういう式を他のカラムと一緒に文字列の中に含めると、式がカンマによっていくつかの部分に分離されるおそれがあります。 |
|
|
|
|
> そういう式を他のカラムと一緒に文字列の中に含めると、式がカンマによっていくつかの部分に分割されるおそれがあります。 |
|
|
|
|
> それはあなたの意図するところではないでしょう。 |
|
|
|
|
|
|
|
|
|
カラムを指定するときは、例えば `user.id` や `user.id AS user_id` などのように、テーブル接頭辞やカラムエイリアスを含めることが出来ます。 |
|
|
|
|
カラムを指定するのに配列を使っている場合は、例えば `['user_id' => 'user.id', 'user_name' => 'user.name']` のように、配列のキーを使ってカラムエイリアスを指定することも出来ます。 |
|
|
|
|
カラムを指定するときは、例えば `user.id` や `user.id AS user_id` などのように、テーブルプレフィクスやカラムエイリアスを含めることが出来ます。 |
|
|
|
|
カラムを指定するのに配列を使う場合は、例えば `['user_id' => 'user.id', 'user_name' => 'user.name']` のように、配列のキーを使ってカラムエイリアスを指定することも出来ます。 |
|
|
|
|
|
|
|
|
|
バージョン 2.0.1 以降では、サブクエリをカラムとしてセレクトすることも出来ます。例えば、 |
|
|
|
|
|
|
|
|
@ -101,14 +101,14 @@ $query->select('user_id')->distinct()->from('post');
|
|
|
|
|
|
|
|
|
|
### `FROM` |
|
|
|
|
|
|
|
|
|
どのテーブルからデータを取得するかを指定するために `from()` を呼びます。 |
|
|
|
|
データを取得するテーブル (一つまたは複数) を指定するためには、`from()` を呼びます。 |
|
|
|
|
|
|
|
|
|
```php |
|
|
|
|
$query->select('*')->from('user'); |
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
カンマ区切りの文字列または配列を使って、複数のテーブルを指定することが出来ます。 |
|
|
|
|
テーブル名は、スキーマ接頭辞 (例えば `'public.user'`)、 および/または、テーブルエイリアス (例えば、`'user u'`) を含んでも構いません。 |
|
|
|
|
テーブル名は、スキーマプレフィクス (例えば `'public.user'`)、 および/または、テーブルエイリアス (例えば、`'user u'`) を含んでも構いません。 |
|
|
|
|
テーブル名が何らかの括弧を含んでいる場合 (すなわち、テーブルがサブクエリまたは DB 式で与えられていることを意味します) を除いて、メソッドが自動的にテーブル名を引用符で囲みます。 |
|
|
|
|
例えば、 |
|
|
|
|
|
|
|
|
@ -304,9 +304,9 @@ $query->filterWhere([
|
|
|
|
|
``` |
|
|
|
|
|
|
|
|
|
`filterWhere()` メソッドは `where()` と非常によく似ています。 |
|
|
|
|
主な相違点は、`filterWhere()` は与えられた条件から空の値を削除する、ということです。 |
|
|
|
|
従って、`$email` が「空」である場合は、結果として生成されるクエリは `...WHERE username=:username` となります。 |
|
|
|
|
そして、`$username` と `$email` が両方とも「空」である場合は、クエリは `WHERE` の部分を持ちません。 |
|
|
|
|
主な相違点は、`filterWhere()` は与えられた条件から空の値のものを削除する、ということです。 |
|
|
|
|
従って、`$email` が空である場合は、結果として生成されるクエリは `...WHERE username=:username` となります。 |
|
|
|
|
そして、`$username` と `$email` が両方とも空である場合は、クエリは `WHERE` の部分を持ちません。 |
|
|
|
|
|
|
|
|
|
値が *空* であるのは、null、空文字列、空白文字だけの文字列、または、空配列である場合です。 |
|
|
|
|
|
|
|
|
@ -363,13 +363,13 @@ $query->offset(100);
|
|
|
|
|
|
|
|
|
|
### `JOIN` |
|
|
|
|
|
|
|
|
|
適切な結合メソッドを使って、クエリビルダで `JOIN` 句を生成することが出来ます。 |
|
|
|
|
クエリビルダで `JOIN` 句を生成するために、次の結合メソッドを適用することが出来ます。 |
|
|
|
|
|
|
|
|
|
- `innerJoin()` |
|
|
|
|
- `leftJoin()` |
|
|
|
|
- `rightJoin()` |
|
|
|
|
|
|
|
|
|
次の左外部結合では、二つの関連テーブルから一つのクエリでデータを取得しています。 |
|
|
|
|
次の例では、左外部結合を使って二つの関連するテーブルから一つのクエリでデータを取得しています。 |
|
|
|
|
|
|
|
|
|
```php |
|
|
|
|
$query->select(['user.name AS author', 'post.title as title']) |
|
|
|
@ -389,7 +389,7 @@ $query->join('FULL OUTER JOIN', 'post', 'post.user_id = user.id');
|
|
|
|
|
最初のパラメータが実行する結合タイプです。第二は結合するテーブル、第三は結合の条件です。 |
|
|
|
|
|
|
|
|
|
`FROM` と同様に、サブクエリを結合することも出来ます。 |
|
|
|
|
そのためには、一つの要素を持つ配列としてサブクエリを指定します。 |
|
|
|
|
そのためには、一つだけの要素を持つ配列としてサブクエリを指定します。 |
|
|
|
|
配列の値はサブクエリを表す `Query` オブジェクトとし、配列のキーはサブクエリのエイリアスとしなければなりません。 |
|
|
|
|
例えば、 |
|
|
|
|
|
|
|
|
|