クエリビルダー クラス
CodeIgniter では、クエリビルダー クラスにアクセスできます。このパターンを使用すると、最小限のスクリプトでデータベース内の情報を取得、挿入、および更新できます。場合によっては、データベース操作を実行するために 1 つまたは 2 つのコード行のみが必要になります。CodeIgniter では、各データベーステーブルが独自のクラスファイルである必要はありません。代わりに、より簡素化されたインターフェースを提供します。
簡素さだけでなく、クエリビルダー機能を使用する主な利点は、クエリ構文が各データベースアダプターによって生成されるため、データベースに依存しないアプリケーションを作成できることです。また、値がシステムによって自動的にエスケープされるため、より安全なクエリも可能です。
注意
CodeIgniter では、データベース、テーブル、および列名にドット (.
) を使用できません。
SQL インジェクション保護
クエリビルダーを使用すると、SQL ステートメントを非常に安全に生成できます。ただし、渡すデータに関係なく、SQL インジェクションを防ぐように設計されていません。
- クエリビルダーに渡される引数は、次のいずれかになります。
フィールド(またはテーブル)名などの識別子
それらの値
SQL 文字列の一部
クエリビルダーは、デフォルトですべての値をエスケープします。
また、デフォルトで識別子とSQL 文字列内の識別子を適切に保護しようとします。ただし、これは多くのユースケースでうまく機能するように実装されており、すべての攻撃を防ぐように設計されていません。したがって、適切な検証なしにユーザー入力を渡さないようにする必要があります。
また、多くのメソッドには、エスケープを無効にするように設定できる $escape
パラメーターがあります。$escape
が false に設定されている場合、クエリビルダーによる保護は提供されないため、クエリビルダーに渡す前に、それらが適切にエスケープまたは保護されていることを確認する必要があります。RawSql
を使用して生の SQL ステートメントを指定する場合も同様です。
クエリビルダーのロード
クエリビルダーは、データベース接続の table()
メソッドを介してロードされます。これにより、クエリの FROM 部分が設定され、クエリビルダー クラスの新しいインスタンスが返されます。
<?php
$db = \Config\Database::connect();
$builder = $db->table('users');
クエリビルダーは、クラスを明示的に要求した場合にのみメモリにロードされるため、デフォルトではリソースは使用されません。
データの選択
次のメソッドを使用すると、SQL SELECT ステートメントを構築できます。
Get
$builder->get()
選択クエリを実行し、結果を返します。テーブルからすべてのレコードを取得するために単独で使用できます。
<?php
$builder = $db->table('mytable');
$query = $builder->get(); // Produces: SELECT * FROM mytable
最初のパラメーターと 2 番目のパラメーターを使用すると、limit および offset 句を設定できます。
<?php
$query = $builder->get(10, 20);
/*
* Executes: SELECT * FROM mytable LIMIT 20, 10
* (in MySQL. Other databases have slightly different syntax)
*/
上記のメソッドが $query という名前の変数に割り当てられていることに気付くでしょう。これは結果を表示するために使用できます。
<?php
$query = $builder->get();
foreach ($query->getResult() as $row) {
echo $row->title;
}
結果の生成に関する詳しい説明については、getResult*() メソッド ページを参照してください。
$builder->getCompiledSelect()
$builder->get()
と同様に選択クエリをコンパイルしますが、クエリを実行しません。このメソッドは、SQL クエリを文字列として返すだけです。
例
<?php
$sql = $builder->getCompiledSelect();
echo $sql;
// Prints string: SELECT * FROM mytable
最初のパラメーターを使用すると、クエリビルダークエリがリセットされるかどうかを設定できます(デフォルトでは、$builder->get()
を使用する場合と同様にリセットされます)。
<?php
echo $builder->limit(10, 20)->getCompiledSelect(false);
/*
* Prints string: SELECT * FROM mytable LIMIT 20, 10
* (in MySQL. Other databases have slightly different syntax)
*/
echo $builder->select('title, content, date')->getCompiledSelect();
// Prints string: SELECT title, content, date FROM mytable LIMIT 20, 10
上記の例で注目すべき重要な点は、2 番目のクエリでは limit(10, 20)
が使用されていませんが、生成された SQL クエリには LIMIT 20, 10
が含まれていることです。この結果の理由は、最初のパラメーターが false
に設定されているためです。
$builder->getWhere()
$builder->where()
メソッドを使用する代わりに、最初のパラメーターに「where」句を追加できる点を除いて、get()
メソッドと同じです。
<?php
$query = $builder->getWhere(['id' => $id], $limit, $offset);
詳細については、以下の where()
メソッドについてお読みください。
Select
$builder->select()
クエリの SELECT 部分を記述できます。
<?php
$builder->select('title, content, date');
$query = $builder->get();
// Executes: SELECT title, content, date FROM mytable
注意
テーブルからすべて (*
) を選択する場合は、このメソッドを使用する必要はありません。省略した場合、CodeIgniter はすべてのフィールドを選択したいとみなし、自動的に SELECT *
を追加します。
$builder->select()
は、オプションの 2 番目のパラメーターを受け入れます。これを false
に設定すると、CodeIgniter はフィールド名またはテーブル名を保護しようとしません。これは、フィールドの自動エスケープがそれらを破損させる可能性がある複合 select ステートメントが必要な場合に役立ちます。
<?php
$builder->select('(SELECT SUM(payments.amount) FROM payments WHERE payments.invoice_id=4) AS amount_paid', false);
$query = $builder->get();
RawSql
バージョン 4.2.0 で新規追加。
v4.2.0 以降、$builder->select()
は、生の SQL 文字列を表す CodeIgniter\Database\RawSql
インスタンスを受け入れます。
<?php
use CodeIgniter\Database\RawSql;
$sql = 'REGEXP_SUBSTR(ral_anno,"[0-9]{1,2}([,.][0-9]{1,3})([,.][0-9]{1,3})") AS ral';
$builder->select(new RawSql($sql));
$query = $builder->get();
警告
RawSql
を使用する場合は、値をエスケープし、識別子を手動で保護する必要があります。そうしないと、SQL インジェクションが発生する可能性があります。
$builder->selectMax()
クエリの SELECT MAX(field) 部分を記述します。オプションで、結果のフィールドの名前を変更するために、2 番目のパラメーターを含めることができます。
<?php
$builder->selectMax('age');
$query = $builder->get();
// Produces: SELECT MAX(age) as age FROM mytable
$builder->selectMax('age', 'member_age');
$query = $builder->get();
// Produces: SELECT MAX(age) as member_age FROM mytable
$builder->selectMin()
クエリの SELECT MIN(field) 部分を記述します。selectMax()
と同様に、オプションで、結果のフィールドの名前を変更するために、2 番目のパラメーターを含めることができます。
<?php
$builder->selectMin('age');
$query = $builder->get();
// Produces: SELECT MIN(age) as age FROM mytable
$builder->selectAvg()
クエリの SELECT AVG(field) 部分を記述します。selectMax()
と同様に、オプションで、結果のフィールドの名前を変更するために、2 番目のパラメーターを含めることができます。
<?php
$builder->selectAvg('age');
$query = $builder->get();
// Produces: SELECT AVG(age) as age FROM mytable
$builder->selectSum()
クエリの SELECT SUM(field) 部分を記述します。selectMax()
と同様に、オプションで、結果のフィールドの名前を変更するために、2 番目のパラメーターを含めることができます。
<?php
$builder->selectSum('age');
$query = $builder->get();
// Produces: SELECT SUM(age) as age FROM mytable
$builder->selectCount()
クエリに SELECT COUNT(field) 部分を記述します。 selectMax()
と同様に、結果のフィールド名を変更するための2番目のパラメーターをオプションで含めることができます。
注意
このメソッドは、groupBy()
と組み合わせて使用すると特に役立ちます。結果のカウント全般については、 countAll()
または countAllResults()
を参照してください。
<?php
$builder->selectCount('age');
$query = $builder->get();
// Produces: SELECT COUNT(age) as age FROM mytable
$builder->selectSubquery()
SELECT セクションにサブクエリを追加します。
$subquery = $db->table('countries')->select('name')->where('id', 1);
$builder = $db->table('users')->select('name')->selectSubquery($subquery, 'country');
$query = $builder->get();
// Produces: SELECT `name`, (SELECT `name` FROM `countries` WHERE `id` = 1) `country` FROM `users`
From
$builder->from()
クエリの FROM 部分を記述できます。
<?php
$builder = $db->table('users');
$builder->select('title, content, date');
$builder->from('mytable');
$query = $builder->get();
// Produces: SELECT title, content, date FROM users, mytable
注意
前に示したように、クエリの FROM 部分は、 $db->table()
メソッドで指定できます。 from()
を追加で呼び出すと、クエリの FROM 部分にテーブルが追加されます。
サブクエリ
$builder->fromSubquery()
FROM クエリの一部をサブクエリとして記述できます。
ここで、既存のテーブルにサブクエリを追加します。
<?php
$subquery = $db->table('users');
$builder = $db->table('jobs')->fromSubquery($subquery, 'alias');
$query = $builder->get();
// Produces: SELECT * FROM `jobs`, (SELECT * FROM `users`) `alias`
サブクエリをメインテーブルにするには、$db->newQuery()
メソッドを使用します。
<?php
$subquery = $db->table('users')->select('id, name');
$builder = $db->newQuery()->fromSubquery($subquery, 't');
$query = $builder->get();
// Produces: SELECT * FROM (SELECT `id`, `name` FROM users) `t`
Join
$builder->join()
クエリの JOIN 部分を記述できます。
<?php
$builder = $db->table('blogs');
$builder->select('*');
$builder->join('comments', 'comments.id = blogs.id');
$query = $builder->get();
/*
* Produces:
* SELECT * FROM blogs JOIN comments ON comments.id = blogs.id
*/
1つのクエリで複数の結合が必要な場合は、メソッドを複数回呼び出すことができます。
特定のタイプの JOIN が必要な場合は、メソッドの3番目のパラメーターで指定できます。オプションは、 left
、 right
、 outer
、 inner
、 left outer
、および right outer
です。
<?php
$builder->join('comments', 'comments.id = blogs.id', 'left');
// Produces: LEFT JOIN comments ON comments.id = blogs.id
RawSql
バージョン 4.2.0 で新規追加。
v4.2.0 以降、 $builder->join()
は、生の SQL 文字列を表す CodeIgniter\Database\RawSql
インスタンスを受け入れるようになりました。
<?php
use CodeIgniter\Database\RawSql;
$sql = 'user.id = device.user_id AND ((1=1 OR 1=1) OR (1=1 OR 1=1))';
$builder->join('user', new RawSql($sql), 'LEFT');
// Produces: LEFT JOIN "user" ON user.id = device.user_id AND ((1=1 OR 1=1) OR (1=1 OR 1=1))
警告
RawSql
を使用する場合は、値をエスケープし、識別子を手動で保護する必要があります。そうしないと、SQL インジェクションが発生する可能性があります。
特定のデータの検索
Where
$builder->where()
このメソッドを使用すると、5つの方法のいずれかを使用して WHERE 句を設定できます。
注意
カスタム文字列を使用する場合を除き、このメソッドに渡されるすべての値は自動的にエスケープされ、より安全なクエリが生成されます。
注意
$builder->where()
はオプションの3番目のパラメーターを受け入れます。それを false
に設定すると、CodeIgniter はフィールド名またはテーブル名を保護しようとしません。
1. シンプルなキー/値メソッド
<?php $builder->where('name', $name); // Produces: WHERE name = 'Joe'等号が自動的に追加されることに注意してください。
複数のメソッド呼び出しを使用すると、それらの間に AND が挿入されてチェーン化されます。
<?php $builder->where('name', $name); $builder->where('title', $title); $builder->where('status', $status); // WHERE name = 'Joe' AND title = 'boss' AND status = 'active'
2. カスタムキー/値メソッド
比較を制御するために、最初のパラメーターに演算子を含めることができます。
<?php $builder->where('name !=', $name); $builder->where('id <', $id); // Produces: WHERE name != 'Joe' AND id < 45
3. 連想配列メソッド
<?php $array = ['name' => $name, 'title' => $title, 'status' => $status]; $builder->where($array); // Produces: WHERE name = 'Joe' AND title = 'boss' AND status = 'active'このメソッドを使用して、独自の演算子を含めることもできます。
<?php $array = ['name !=' => $name, 'id <' => $id, 'date >' => $date]; $builder->where($array);
4. カスタム文字列
独自の句を手動で記述できます。
<?php $where = "name='Joe' AND status='boss' OR status='active'"; $builder->where($where);警告
文字列内でユーザーが提供したデータを使用している場合は、値をエスケープし、識別子を手動で保護する必要があります。そうしないと、SQLインジェクションが発生する可能性があります。
<?php $name = $builder->db->escape('Joe'); $where = "name={$name} AND status='boss' OR status='active'"; $builder->where($where);
5. RawSql
バージョン 4.2.0 で新規追加。
v4.2.0 以降、
$builder->where()
は、生の SQL 文字列を表すCodeIgniter\Database\RawSql
インスタンスを受け入れるようになりました。<?php use CodeIgniter\Database\RawSql; $sql = "id > 2 AND name != 'Accountant'"; $builder->where(new RawSql($sql));警告
RawSql
を使用する場合は、値をエスケープし、識別子を手動で保護する必要があります。そうしないと、SQL インジェクションが発生する可能性があります。
6. サブクエリ
<?php // With closure use CodeIgniter\Database\BaseBuilder; $builder->where('advance_amount <', static function (BaseBuilder $builder) { $builder->select('MAX(advance_amount)', false)->from('orders')->where('id >', 2); }); // Produces: WHERE "advance_amount" < (SELECT MAX(advance_amount) FROM "orders" WHERE "id" > 2) // With builder directly $subQuery = $db->table('orders')->select('MAX(advance_amount)', false)->where('id >', 2); $builder->where('advance_amount <', $subQuery);
$builder->orWhere()
このメソッドは上記のものと同じですが、複数のインスタンスが OR で結合される点が異なります。
<?php
$builder->where('name !=', $name);
$builder->orWhere('id >', $id);
// Produces: WHERE name != 'Joe' OR id > 50
$builder->whereIn()
適切な場合、 AND で結合された WHERE フィールド IN (‘item’, ‘item’) SQL クエリを生成します。
<?php
$names = ['Frank', 'Todd', 'James'];
$builder->whereIn('username', $names);
// Produces: WHERE username IN ('Frank', 'Todd', 'James')
値の配列の代わりにサブクエリを使用できます。
<?php
// With closure
use CodeIgniter\Database\BaseBuilder;
$builder->whereIn('id', static function (BaseBuilder $builder) {
$builder->select('job_id')->from('users_jobs')->where('user_id', 3);
});
// Produces: WHERE "id" IN (SELECT "job_id" FROM "users_jobs" WHERE "user_id" = 3)
// With builder directly
$subQuery = $db->table('users_jobs')->select('job_id')->where('user_id', 3);
$builder->whereIn('id', $subQuery);
$builder->orWhereIn()
適切な場合、 OR で結合された WHERE field IN (‘item’, ‘item’) SQL クエリを生成します。
<?php
$names = ['Frank', 'Todd', 'James'];
$builder->orWhereIn('username', $names);
// Produces: OR username IN ('Frank', 'Todd', 'James')
値の配列の代わりにサブクエリを使用できます。
<?php
// With closure
use CodeIgniter\Database\BaseBuilder;
$builder->orWhereIn('id', static function (BaseBuilder $builder) {
$builder->select('job_id')->from('users_jobs')->where('user_id', 3);
});
// Produces: OR "id" IN (SELECT "job_id" FROM "users_jobs" WHERE "user_id" = 3)
// With builder directly
$subQuery = $db->table('users_jobs')->select('job_id')->where('user_id', 3);
$builder->orWhereIn('id', $subQuery);
$builder->whereNotIn()
適切な場合、 AND で結合された WHERE field NOT IN (‘item’, ‘item’) SQL クエリを生成します。
<?php
$names = ['Frank', 'Todd', 'James'];
$builder->whereNotIn('username', $names);
// Produces: WHERE username NOT IN ('Frank', 'Todd', 'James')
値の配列の代わりにサブクエリを使用できます。
<?php
// With closure
use CodeIgniter\Database\BaseBuilder;
$builder->whereNotIn('id', static function (BaseBuilder $builder) {
$builder->select('job_id')->from('users_jobs')->where('user_id', 3);
});
// Produces: WHERE "id" NOT IN (SELECT "job_id" FROM "users_jobs" WHERE "user_id" = 3)
// With builder directly
$subQuery = $db->table('users_jobs')->select('job_id')->where('user_id', 3);
$builder->whereNotIn('id', $subQuery);
$builder->orWhereNotIn()
適切な場合、 OR で結合された WHERE field NOT IN (‘item’, ‘item’) SQL クエリを生成します。
<?php
$names = ['Frank', 'Todd', 'James'];
$builder->orWhereNotIn('username', $names);
// Produces: OR username NOT IN ('Frank', 'Todd', 'James')
値の配列の代わりにサブクエリを使用できます。
<?php
// With closure
use CodeIgniter\Database\BaseBuilder;
$builder->orWhereNotIn('id', static function (BaseBuilder $builder) {
$builder->select('job_id')->from('users_jobs')->where('user_id', 3);
});
// Produces: OR "id" NOT IN (SELECT "job_id" FROM "users_jobs" WHERE "user_id" = 3)
// With builder directly
$subQuery = $db->table('users_jobs')->select('job_id')->where('user_id', 3);
$builder->orWhereNotIn('id', $subQuery);
類似データの検索
Like
$builder->like()
このメソッドを使用すると、検索に役立つ LIKE 句を生成できます。
注意
このメソッドに渡されるすべての値は自動的にエスケープされます。
注意
すべての like*
メソッドのバリエーションは、メソッドに5番目のパラメーターとして true
を渡すことで、大文字と小文字を区別しない検索を強制できます。これにより、可能な場合はプラットフォーム固有の機能が使用されます。それ以外の場合は、値を小文字に強制します。たとえば、 WHERE LOWER(column) LIKE '%search%'
です。効果を得るには、 column
の代わりに LOWER(column)
のインデックスを作成する必要がある場合があります。
1. シンプルなキー/値メソッド
<?php $builder->like('title', 'match'); // Produces: WHERE `title` LIKE '%match%' ESCAPE '!'複数のメソッド呼び出しを使用すると、それらの間に AND が挿入されてチェーン化されます。
<?php $builder->like('title', 'match'); $builder->like('body', 'match'); // WHERE `title` LIKE '%match%' ESCAPE '!' AND `body` LIKE '%match%' ESCAPE '!'ワイルドカード (%) を配置する場所を制御する場合は、オプションの3番目の引数を使用できます。オプションは、
before
、after
、およびboth
(これがデフォルト) です。<?php $builder->like('title', 'match', 'before'); // Produces: WHERE `title` LIKE '%match' ESCAPE '!' $builder->like('title', 'match', 'after'); // Produces: WHERE `title` LIKE 'match%' ESCAPE '!' $builder->like('title', 'match', 'both'); // Produces: WHERE `title` LIKE '%match%' ESCAPE '!'
2. 連想配列メソッド
<?php $array = ['title' => $match, 'page1' => $match, 'page2' => $match]; $builder->like($array); /* * WHERE `title` LIKE '%match%' ESCAPE '!' * AND `page1` LIKE '%match%' ESCAPE '!' * AND `page2` LIKE '%match%' ESCAPE '!' */
3. RawSql
バージョン 4.2.0 で新規追加。
v4.2.0 以降、
$builder->like()
は、生の SQL 文字列を表すCodeIgniter\Database\RawSql
インスタンスを受け入れるようになりました。<?php use CodeIgniter\Database\RawSql; $sql = "CONCAT(users.name, ' ', IF(users.surname IS NULL OR users.surname = '', '', users.surname))"; $rawSql = new RawSql($sql); $builder->like($rawSql, 'value', 'both');警告
RawSql
を使用する場合は、値をエスケープし、識別子を手動で保護する必要があります。そうしないと、SQL インジェクションが発生する可能性があります。
$builder->orLike()
このメソッドは上記のものと同じですが、複数のインスタンスが OR で結合される点が異なります。
<?php
$builder->like('title', 'match');
$builder->orLike('body', $match);
// WHERE `title` LIKE '%match%' ESCAPE '!' OR `body` LIKE '%match%' ESCAPE '!'
$builder->notLike()
このメソッドは like()
と同じですが、 NOT LIKE ステートメントを生成する点が異なります。
<?php
$builder->notLike('title', 'match'); // WHERE `title` NOT LIKE '%match% ESCAPE '!'
$builder->orNotLike()
このメソッドは notLike()
と同じですが、複数のインスタンスが OR で結合される点が異なります。
<?php
$builder->like('title', 'match');
$builder->orNotLike('body', 'match');
// WHERE `title` LIKE '%match% OR `body` NOT LIKE '%match%' ESCAPE '!'
$builder->groupBy()
クエリの GROUP BY 部分を記述できます。
<?php
$builder->groupBy('title');
// Produces: GROUP BY title
複数の値の配列を渡すこともできます。
<?php
$builder->groupBy(['title', 'date']);
// Produces: GROUP BY title, date
$builder->distinct()
クエリに DISTINCT キーワードを追加します。
<?php
$builder->distinct();
$builder->get();
// Produces: SELECT DISTINCT * FROM mytable
$builder->having()
クエリの HAVING 部分を記述できます。構文には、1つの引数または2つの引数の2つの可能性があります。
<?php
$builder->having('user_id = 45'); // Produces: HAVING user_id = 45
$builder->having('user_id', 45); // Produces: HAVING user_id = 45
複数の値の配列を渡すこともできます。
<?php
$builder->having(['title =' => 'My Title', 'id <' => $id]);
// Produces: HAVING title = 'My Title', id < 45
CodeIgniter が値をエスケープするデータベースを使用している場合は、オプションの3番目の引数を渡し、それを false
に設定することで、コンテンツのエスケープを回避できます。
<?php
$builder->having('user_id', 45); // Produces: HAVING `user_id` = 45 in some databases such as MySQL
$builder->having('user_id', 45, false); // Produces: HAVING user_id = 45
$builder->orHaving()
having()
と同じですが、複数の句を OR で区切る点が異なります。
$builder->havingIn()
適切な場合、 AND で結合された HAVING field IN (‘item’, ‘item’) SQL クエリを生成します。
<?php
$groups = [1, 2, 3];
$builder->havingIn('group_id', $groups);
// Produces: HAVING group_id IN (1, 2, 3)
値の配列の代わりにサブクエリを使用できます。
<?php
// With closure
use CodeIgniter\Database\BaseBuilder;
$builder->havingIn('id', static function (BaseBuilder $builder) {
$builder->select('user_id')->from('users_jobs')->where('group_id', 3);
});
// Produces: HAVING "id" IN (SELECT "user_id" FROM "users_jobs" WHERE "group_id" = 3)
// With builder directly
$subQuery = $db->table('users_jobs')->select('user_id')->where('group_id', 3);
$builder->havingIn('id', $subQuery);
$builder->orHavingIn()
適切な場合、 OR で結合された HAVING field IN (‘item’, ‘item’) SQL クエリを生成します。
<?php
$groups = [1, 2, 3];
$builder->orHavingIn('group_id', $groups);
// Produces: OR group_id IN (1, 2, 3)
値の配列の代わりにサブクエリを使用できます。
<?php
// With closure
use CodeIgniter\Database\BaseBuilder;
$builder->orHavingIn('id', static function (BaseBuilder $builder) {
$builder->select('user_id')->from('users_jobs')->where('group_id', 3);
});
// Produces: OR "id" IN (SELECT "user_id" FROM "users_jobs" WHERE "group_id" = 3)
// With builder directly
$subQuery = $db->table('users_jobs')->select('user_id')->where('group_id', 3);
$builder->orHavingIn('id', $subQuery);
$builder->havingNotIn()
適切な場合、 AND で結合された HAVING field NOT IN (‘item’, ‘item’) SQL クエリを生成します。
<?php
$groups = [1, 2, 3];
$builder->havingNotIn('group_id', $groups);
// Produces: HAVING group_id NOT IN (1, 2, 3)
値の配列の代わりにサブクエリを使用できます。
<?php
// With closure
use CodeIgniter\Database\BaseBuilder;
$builder->havingNotIn('id', static function (BaseBuilder $builder) {
$builder->select('user_id')->from('users_jobs')->where('group_id', 3);
});
// Produces: HAVING "id" NOT IN (SELECT "user_id" FROM "users_jobs" WHERE "group_id" = 3)
// With builder directly
$subQuery = $db->table('users_jobs')->select('user_id')->where('group_id', 3);
$builder->havingNotIn('id', $subQuery);
$builder->orHavingNotIn()
適切な場合、 OR で結合された HAVING field NOT IN (‘item’, ‘item’) SQL クエリを生成します。
<?php
$groups = [1, 2, 3];
$builder->havingNotIn('group_id', $groups);
// Produces: OR group_id NOT IN (1, 2, 3)
値の配列の代わりにサブクエリを使用できます。
<?php
// With closure
use CodeIgniter\Database\BaseBuilder;
$builder->orHavingNotIn('id', static function (BaseBuilder $builder) {
$builder->select('user_id')->from('users_jobs')->where('group_id', 3);
});
// Produces: OR "id" NOT IN (SELECT "user_id" FROM "users_jobs" WHERE "group_id" = 3)
// With builder directly
$subQuery = $db->table('users_jobs')->select('user_id')->where('group_id', 3);
$builder->orHavingNotIn('id', $subQuery);
$builder->havingLike()
このメソッドを使用すると、検索に役立つ、クエリの HAVING 部分に LIKE 句を生成できます。
注意
このメソッドに渡されるすべての値は自動的にエスケープされます。
注意
すべての havingLike*()
メソッドのバリエーションは、5番目のパラメータに true
を渡すことで、大文字と小文字を区別しない検索を強制できます。これにより、利用可能な場合はプラットフォーム固有の機能が使用され、それ以外の場合は値が小文字に強制されます。例えば、HAVING LOWER(column) LIKE '%search%'
のようになります。これを効果的にするためには、column
ではなく LOWER(column)
に対してインデックスを作成する必要がある場合があります。
1. 単純なキー/値メソッド
<?php $builder->havingLike('title', 'match'); // Produces: HAVING `title` LIKE '%match%' ESCAPE '!'複数のメソッド呼び出しを使用すると、それらの間に AND が挿入されてチェーン化されます。
<?php $builder->havingLike('title', 'match'); $builder->havingLike('body', 'match'); // HAVING `title` LIKE '%match%' ESCAPE '!' AND `body` LIKE '%match% ESCAPE '!'ワイルドカード (%) を配置する場所を制御する場合は、オプションの3番目の引数を使用できます。オプションは、
before
、after
、およびboth
(これがデフォルト) です。<?php $builder->havingLike('title', 'match', 'before'); // Produces: HAVING `title` LIKE '%match' ESCAPE '!' $builder->havingLike('title', 'match', 'after'); // Produces: HAVING `title` LIKE 'match%' ESCAPE '!' $builder->havingLike('title', 'match', 'both'); // Produces: HAVING `title` LIKE '%match%' ESCAPE '!'
2. 連想配列メソッド
<?php $array = ['title' => $match, 'page1' => $match, 'page2' => $match]; $builder->havingLike($array); /* * HAVING `title` LIKE '%match%' ESCAPE '!' * AND `page1` LIKE '%match%' ESCAPE '!' * AND `page2` LIKE '%match%' ESCAPE '!' */
$builder->orHavingLike()
このメソッドは上記のものと同じですが、複数のインスタンスが OR で結合される点が異なります。
<?php
$builder->havingLike('title', 'match');
$builder->orHavingLike('body', $match);
// HAVING `title` LIKE '%match%' ESCAPE '!' OR `body` LIKE '%match%' ESCAPE '!'
$builder->notHavingLike()
このメソッドは havingLike()
と同じですが、NOT LIKE ステートメントを生成する点が異なります。
<?php
$builder->notHavingLike('title', 'match');
// HAVING `title` NOT LIKE '%match% ESCAPE '!'
$builder->orNotHavingLike()
このメソッドは notHavingLike()
と同じですが、複数のインスタンスが OR で結合される点が異なります。
<?php
$builder->havingLike('title', 'match');
$builder->orNotHavingLike('body', 'match');
// HAVING `title` LIKE '%match% OR `body` NOT LIKE '%match%' ESCAPE '!'
結果の並べ替え
OrderBy
$builder->orderBy()
ORDER BY 句を設定できます。
最初のパラメータには、並べ替えたい列の名前を指定します。
2番目のパラメータでは、結果の方向を設定できます。オプションは ASC
、DESC
、および RANDOM
です。
<?php
$builder->orderBy('title', 'DESC');
// Produces: ORDER BY `title` DESC
最初のパラメータに独自の文字列を渡すこともできます。
<?php
$builder->orderBy('title DESC, name ASC');
// Produces: ORDER BY `title` DESC, `name` ASC
複数のフィールドが必要な場合は、複数のメソッド呼び出しを行うことができます。
<?php
$builder->orderBy('title', 'DESC');
$builder->orderBy('name', 'ASC');
// Produces: ORDER BY `title` DESC, `name` ASC
RANDOM
の方向オプションを選択した場合、数値シード値を指定しない限り、最初のパラメータは無視されます。
<?php
$builder->orderBy('title', 'RANDOM');
// Produces: ORDER BY RAND()
$builder->orderBy(42, 'RANDOM');
// Produces: ORDER BY RAND(42)
結果の制限またはカウント
Limit
$builder->limit()
クエリによって返される行数を制限できます。
<?php
$builder->limit(10);
// Produces: LIMIT 10
2番目のパラメータでは、結果のオフセットを設定できます。
<?php
$builder->limit(10, 20);
// Produces: LIMIT 20, 10 (in MySQL. Other databases have slightly different syntax)
$builder->countAllResults()
特定のクエリビルダーのクエリの行数を決定できます。クエリは、where()
、orWhere()
、like()
、orLike()
などのクエリビルダーの制限を受け入れます。例
<?php
echo $builder->countAllResults(); // Produces an integer, like 25
$builder->like('title', 'match');
$builder->from('my_table');
echo $builder->countAllResults(); // Produces an integer, like 17
ただし、このメソッドは、select()
に渡した可能性のあるすべてのフィールド値をリセットします。それらを保持する必要がある場合は、最初のパラメータとして false
を渡すことができます。
<?php
echo $builder->countAllResults(false); // Produces an integer, like 17
$builder->countAll()
特定のテーブルの行数を決定できます。例
<?php
echo $builder->countAll(); // Produces an integer, like 25
countAllResult()
メソッドと同様に、このメソッドは、select()
に渡した可能性のあるすべてのフィールド値もリセットします。それらを保持する必要がある場合は、最初のパラメータとして false
を渡すことができます。
ユニオンクエリ
ユニオン
$builder->union()
2つ以上の SELECT ステートメントの結果セットを結合するために使用されます。一意の結果のみを返します。
<?php
$builder = $db->table('users')->select('id, name')->limit(10);
$union = $db->table('groups')->select('id, name');
$builder->union($union)->get();
/*
* Produces:
* SELECT * FROM (SELECT `id`, `name` FROM `users` LIMIT 10) uwrp0
* UNION SELECT * FROM (SELECT `id`, `name` FROM `groups`) uwrp1
*/
注意
DBMS(MSSQLやOracleなど)との正しい連携のため、クエリは SELECT * FROM ( ... ) alias
でラップされます。メインクエリには常に uwrp0
のエイリアスが付けられます。union()
を介して追加された後続の各クエリには、エイリアス uwrpN+1
が付けられます。
すべてのユニオンクエリは、union()
メソッドが呼び出された順序に関係なく、メインクエリの後に追加されます。つまり、limit()
または orderBy()
メソッドは、union()
の後に呼び出された場合でも、メインクエリに関連します。
場合によっては、たとえば、クエリ結果のレコードを並べ替えたり、数を制限したりする必要がある場合があります。解決策は、$db->newQuery()
を介して作成されたラッパーを使用することです。以下の例では、最初の5人のユーザーと最後の5人のユーザーを取得し、結果をIDで並べ替えます。
<?php
$union = $db->table('users')->select('id, name')->orderBy('id', 'DESC')->limit(5);
$builder = $db->table('users')->select('id, name')->orderBy('id', 'ASC')->limit(5)->union($union);
$db->newQuery()->fromSubquery($builder, 'q')->orderBy('id', 'DESC')->get();
/*
* Produces:
* SELECT * FROM (
* SELECT * FROM (SELECT `id`, `name` FROM `users` ORDER BY `id` ASC LIMIT 5) uwrp0
* UNION
* SELECT * FROM (SELECT `id`, `name` FROM `users` ORDER BY `id` DESC LIMIT 5) uwrp1
* ) q ORDER BY `id` DESC
*/
$builder->unionAll()
動作は union()
メソッドと同じです。ただし、一意の結果だけでなく、すべての結果が返されます。
クエリのグループ化
グループ
クエリのグループ化を使用すると、括弧で囲むことによって WHERE 句のグループを作成できます。これにより、複雑な WHERE 句を持つクエリを作成できます。ネストされたグループがサポートされています。例
<?php
$builder->select('*')->from('my_table')
->groupStart()
->where('a', 'a')
->orGroupStart()
->where('b', 'b')
->where('c', 'c')
->groupEnd()
->groupEnd()
->where('d', 'd')
->get();
/*
* Generates:
* SELECT * FROM (`my_table`) WHERE ( `a` = 'a' OR ( `b` = 'b' AND `c` = 'c' ) ) AND `d` = 'd'
*/
注意
グループはバランスが取れている必要があります。すべての groupStart()
が groupEnd()
と一致していることを確認してください。
$builder->groupStart()
クエリの WHERE 句に開き括弧を追加して、新しいグループを開始します。
$builder->orGroupStart()
クエリの WHERE 句に開き括弧を追加して新しいグループを開始し、先頭に OR を付けます。
$builder->notGroupStart()
クエリの WHERE 句に開き括弧を追加して新しいグループを開始し、先頭に NOT を付けます。
$builder->orNotGroupStart()
クエリの WHERE 句に開き括弧を追加して新しいグループを開始し、先頭に OR NOT を付けます。
$builder->groupEnd()
クエリの WHERE 句に閉じ括弧を追加して、現在のグループを終了します。
$builder->havingGroupStart()
クエリの HAVING 句に開き括弧を追加して、新しいグループを開始します。
$builder->orHavingGroupStart()
クエリの HAVING 句に開き括弧を追加して新しいグループを開始し、先頭に OR を付けます。
$builder->notHavingGroupStart()
クエリの HAVING 句に開き括弧を追加して新しいグループを開始し、先頭に NOT を付けます。
$builder->orNotHavingGroupStart()
クエリの HAVING 句に開き括弧を追加して新しいグループを開始し、先頭に OR NOT を付けます。
$builder->havingGroupEnd()
クエリの HAVING 句に閉じ括弧を追加して、現在のグループを終了します。
データの挿入
挿入
$builder->insert()
指定したデータに基づいて挿入文字列を生成し、クエリを実行します。メソッドには array または object のいずれかを渡すことができます。以下は配列を使用した例です。
<?php
use CodeIgniter\Database\RawSql;
$data = [
'id' => new RawSql('DEFAULT'),
'title' => 'My title',
'name' => 'My Name',
'date' => '2022-01-01',
'last_update' => new RawSql('CURRENT_TIMESTAMP()'),
];
$builder->insert($data);
/* Produces:
INSERT INTO mytable (id, title, name, date, last_update)
VALUES (DEFAULT, 'My title', 'My name', '2022-01-01', CURRENT_TIMESTAMP())
*/
最初のパラメータは値の連想配列です。
注意
RawSql
を除くすべての値は自動的にエスケープされ、より安全なクエリが生成されます。
警告
RawSql
を使用する場合は、手動でデータをエスケープする必要があります。そうしないと、SQLインジェクションが発生する可能性があります。
以下はオブジェクトを使用した例です。
<?php
namespace App\Libraries;
class MyClass
{
public $title = 'My Title';
public $content = 'My Content';
public $date = 'My Date';
}
<?php
use App\Libraries\MyClass;
$object = new MyClass();
$builder->insert($object);
// Produces: INSERT INTO mytable (title, content, date) VALUES ('My Title', 'My Content', 'My Date')
最初のパラメータはオブジェクトです。
$builder->ignore()
指定したデータに基づいて挿入無視文字列を生成し、クエリを実行します。したがって、同じプライマリキーを持つエントリがすでに存在する場合、クエリは挿入されません。オプションで、boolean をメソッドに渡すことができます。また、insertBatch、update、および delete(サポートされている場合)でも使用できます。以下は、上記の例の配列を使用した例です。
<?php
$data = [
'title' => 'My title',
'name' => 'My Name',
'date' => 'My date',
];
$builder->ignore(true)->insert($data);
// Produces: INSERT OR IGNORE INTO mytable (title, name, date) VALUES ('My title', 'My name', 'My date')
$builder->getCompiledInsert()
$builder->insert()
と同様に挿入クエリをコンパイルしますが、クエリを実行しません。このメソッドは、SQLクエリを文字列として返すだけです。
例
<?php
$data = [
'title' => 'My title',
'name' => 'My Name',
'date' => 'My date',
];
$sql = $builder->set($data)->getCompiledInsert();
echo $sql;
// Produces string: INSERT INTO mytable (`title`, `name`, `date`) VALUES ('My title', 'My name', 'My date')
最初のパラメータを使用すると、クエリビルダーのクエリがリセットされるかどうかを設定できます(デフォルトでは、$builder->insert()
と同様にリセットされます)。
<?php
echo $builder->set('title', 'My Title')->getCompiledInsert(false);
// Produces string: INSERT INTO mytable (`title`) VALUES ('My Title')
echo $builder->set('content', 'My Content')->getCompiledInsert();
// Produces string: INSERT INTO mytable (`title`, `content`) VALUES ('My Title', 'My Content')
2番目のクエリが機能した理由は、最初のパラメータが false
に設定されているためです。
注意
このメソッドはバッチ挿入では機能しません。
insertBatch
$builder->insertBatch()
データからの挿入
指定したデータに基づいて挿入文字列を生成し、クエリを実行します。メソッドには array または object のいずれかを渡すことができます。以下は配列を使用した例です。
<?php
$data = [
[
'title' => 'My title',
'name' => 'My Name',
'date' => 'My date',
],
[
'title' => 'Another title',
'name' => 'Another Name',
'date' => 'Another date',
],
];
$builder->insertBatch($data);
/*
* Produces:
* INSERT INTO mytable (title, name, date)
* VALUES ('My title', 'My name', 'My date'),
* ('Another title', 'Another name', 'Another date')
*/
最初のパラメータは値の連想配列です。
注意
RawSql
を除くすべての値は自動的にエスケープされ、より安全なクエリが生成されます。
警告
RawSql
を使用する場合は、手動でデータをエスケープする必要があります。そうしないと、SQLインジェクションが発生する可能性があります。
クエリからの挿入
クエリから挿入することもできます。
<?php
use CodeIgniter\Database\RawSql;
$query = 'SELECT user2.name, user2.email, user2.country
FROM user2
LEFT JOIN user ON user.email = user2.email
WHERE user.email IS NULL';
$sql = $builder
->ignore(true)
->setQueryAsData(new RawSql($query), null, 'name, country, email')
->insertBatch();
/* MySQLi produces:
INSERT IGNORE INTO `db_user` (`name`, `country`, `email`)
SELECT user2.name, user2.email, user2.country
FROM user2
LEFT JOIN user ON user.email = user2.email
WHERE user.email IS NULL
*/
注意
setQueryAsData()
は v4.3.0 以降で使用できます。
注意
ターゲットテーブルの列と一致するように、select クエリの列にエイリアスを付ける必要があります。
データのUpsert
Upsert
$builder->upsert()
バージョン 4.3.0 で新規追加されました。
提供されたデータに基づいて upsert 文字列を生成し、クエリを実行します。配列またはオブジェクトをメソッドに渡すことができます。デフォルトでは、制約は順に定義されます。最初に主キーが選択され、次に一意キーが選択されます。MySQL はデフォルトですべての制約を使用します。以下は配列を使用する例です。
<?php
$data = [
'email' => '[email protected]',
'name' => 'Ahmadinejad',
'country' => 'Iran',
];
$builder->upsert($data);
// MySQLi produces: INSERT INTO.. ON DUPLICATE KEY UPDATE..
// Postgre produces: INSERT INTO.. ON CONFLICT.. DO UPDATE..
// SQLite3 produces: INSERT INTO.. ON CONFLICT.. DO UPDATE..
// SQLSRV produces: MERGE INTO.. WHEN MATCHED THEN UPDATE.. WHEN NOT MATCHED THEN INSERT..
// OCI8 produces: MERGE INTO.. WHEN MATCHED THEN UPDATE.. WHEN NOT MATCHED THEN INSERT..
最初のパラメータは値の連想配列です。
以下はオブジェクトを使用した例です。
<?php
namespace App\Libraries;
class MyClass
{
public $email = '[email protected]';
public $name = 'Ahmadinejad';
public $country = 'Iran';
}
<?php
use App\Libraries\MyClass;
$object = new MyClass();
$builder->upsert($object);
最初のパラメータはオブジェクトです。
注意
すべての値は自動的にエスケープされ、より安全なクエリが生成されます。
$builder->getCompiledUpsert()
バージョン 4.3.0 で新規追加されました。
$builder->upsert()
と同様に upsert クエリをコンパイルしますが、クエリを実行しません。このメソッドは、SQL クエリを文字列として返すだけです。
例
<?php
$data = [
'email' => '[email protected]',
'name' => 'Ahmadinejad',
'country' => 'Iran',
];
$sql = $builder->setData($data)->getCompiledUpsert();
echo $sql;
/* MySQLi produces:
INSERT INTO `db_user` (`country`, `email`, `name`)
VALUES ('Iran','[email protected]','Ahmadinejad')
ON DUPLICATE KEY UPDATE
`country` = VALUES(`country`),
`email` = VALUES(`email`),
`name` = VALUES(`name`)
*/
注意
このメソッドはバッチ upsert には使用できません。
upsertBatch
$builder->upsertBatch()
バージョン 4.3.0 で新規追加されました。
データからの Upsert
提供されたデータに基づいて upsert 文字列を生成し、クエリを実行します。配列またはオブジェクトをメソッドに渡すことができます。デフォルトでは、制約は順に定義されます。最初に主キーが選択され、次に一意キーが選択されます。MySQL はデフォルトですべての制約を使用します。
以下は配列を使用する例です。
<?php
$data = [
[
'id' => 2,
'email' => '[email protected]',
'name' => 'Ahmadinejad',
'country' => 'Iran',
],
[
'id' => null,
'email' => '[email protected]',
'name' => 'Pedro',
'country' => 'El Salvador',
],
];
$builder->upsertBatch($data);
// MySQLi produces: INSERT INTO.. ON DUPLICATE KEY UPDATE..
// Postgre produces: INSERT INTO.. ON CONFLICT.. DO UPDATE..
// SQLite3 produces: INSERT INTO.. ON CONFLICT.. DO UPDATE..
// SQLSRV produces: MERGE INTO.. WHEN MATCHED THEN UPDATE.. WHEN NOT MATCHED THEN INSERT..
// OCI8 produces: MERGE INTO.. WHEN MATCHED THEN UPDATE.. WHEN NOT MATCHED THEN INSERT..
最初のパラメータは値の連想配列です。
注意
すべての値は自動的にエスケープされ、より安全なクエリが生成されます。
クエリからの Upsert
クエリから upsert することもできます。
<?php
use CodeIgniter\Database\RawSql;
$query = $this->db->table('user2')
->select('user2.name, user2.email, user2.country')
->join('user', 'user.email = user2.email', 'left')
->where('user.email IS NULL');
$additionalUpdateField = ['updated_at' => new RawSql('CURRENT_TIMESTAMP')];
$sql = $builder->setQueryAsData($query)
->onConstraint('email')
->updateFields($additionalUpdateField, true)
->upsertBatch();
/* MySQLi produces:
INSERT INTO `db_user` (`country`, `email`, `name`)
SELECT user2.name, user2.email, user2.country
FROM user2
LEFT JOIN user ON user.email = user2.email
WHERE user.email IS NULL
ON DUPLICATE KEY UPDATE
`country` = VALUES(`country`),
`email` = VALUES(`email`),
`name` = VALUES(`name`),
`updated_at` = CURRENT_TIMESTAMP
*/
注意
setQueryAsData()
、onConstraint()
、および updateFields()
メソッドは v4.3.0 以降で使用できます。
注意
ターゲットテーブルの列と一致するように、select クエリの列にエイリアスを付ける必要があります。
$builder->onConstraint()
バージョン 4.3.0 で新規追加されました。
upsert に使用する制約を手動で設定できます。MySQL はデフォルトですべての制約を確認するため、これは MySQL では機能しません。
<?php
$data = [
'id' => 2,
'email' => '[email protected]',
'name' => 'Ahmadinejad',
'country' => 'Iran',
];
$builder->onConstraint('email')->upsert($data);
/* Postgre produces:
INSERT INTO "db_user"("country", "email", "id", "name")
VALUES ('Iran','[email protected]',2,'Ahmadinejad')
ON CONFLICT("email")
DO UPDATE SET
"country" = "excluded"."country",
"id" = "excluded"."id",
"name" = "excluded"."name"
*/
このメソッドは、文字列または列の配列を受け付けます。
$builder->updateFields()
バージョン 4.3.0 で新規追加されました。
upsert を実行する際に更新するフィールドを手動で設定できます。
<?php
$data = [
'id' => 2,
'email' => '[email protected]',
'name' => 'Ahmadinejad Zaghari',
'country' => 'Afghanistan',
];
$builder->updateFields('name, country')->setData($data, null, '_upsert')->upsert();
/* SQLSRV produces:
MERGE INTO "test"."dbo"."db_user"
USING (
VALUES ('Iran','[email protected]',2,'Ahmadinejad')
) "_upsert" ("country", "email", "id", "name")
ON ("test"."dbo"."db_user"."id" = "_upsert"."id")
WHEN MATCHED THEN UPDATE SET
"country" = "_upsert"."country",
"name" = "_upsert"."name"
WHEN NOT MATCHED THEN INSERT ("country", "email", "id", "name")
VALUES ("_upsert"."country", "_upsert"."email", "_upsert"."id", "_upsert"."name");
*/
このメソッドは、文字列、列の配列、または RawSql を受け付けます。データセットに含まれていない追加の更新列を指定することもできます。これは、2 番目のパラメータを true
に設定することで行えます。
<?php
use CodeIgniter\Database\RawSql;
$data = [
[
'id' => 2,
'email' => '[email protected]',
'name' => 'Ahmadinejad',
'country' => 'Iran',
],
[
'id' => null,
'email' => '[email protected]',
'name' => 'Pedro',
'country' => 'El Salvador',
],
];
$additionalUpdateField = ['updated_at' => new RawSql('CURRENT_TIMESTAMP')];
$sql = $builder->setData($data)->updateFields($additionalUpdateField, true)->upsertBatch();
/* MySQLi produces:
INSERT INTO `db_user` (`country`, `email`, `name`)
VALUES ('Iran','[email protected]','Ahmadinejad'),('El Salvador','[email protected]','Pedro')
ON DUPLICATE KEY UPDATE
`country` = VALUES(`country`),
`email` = VALUES(`email`),
`name` = VALUES(`name`),
`updated_at` = CURRENT_TIMESTAMP
*/
updated_at
フィールドは挿入されませんが、更新時に使用されることに注意してください。
データの更新
更新
$builder->replace()
このメソッドは、基本的に SQL 標準の DELETE + INSERT である REPLACE ステートメントを実行します。この際、PRIMARY キーと UNIQUE キーが判断の要素として使用されます。このメソッドを利用することで、select()
、update()
、delete()
、および insert()
の呼び出しをさまざまな組み合わせで行う複雑なロジックを実装する必要がなくなります。
例
<?php
$data = [
'title' => 'My title',
'name' => 'My Name',
'date' => 'My date',
];
$builder->replace($data);
// Executes: REPLACE INTO mytable (title, name, date) VALUES ('My title', 'My name', 'My date')
上記の例では、title
フィールドが主キーであると仮定した場合、title
値として My title
を含む行が存在すると、その行は削除され、新しい行データに置き換えられます。
set()
メソッドの使用も許可されており、すべての値は insert()
の場合と同様に自動的にエスケープされます。
$builder->set()
このメソッドを使用すると、挿入または更新の値を設定できます。
insert() または update() メソッドにデータ配列を直接渡す代わりに使用できます。
<?php
$builder->set('name', $name);
$builder->insert();
// Produces: INSERT INTO mytable (`name`) VALUES ('{$name}')
複数のメソッドを呼び出した場合、挿入または更新のどちらを行っているかに基づいて適切に組み立てられます。
<?php
$builder->set('name', $name);
$builder->set('title', $title);
$builder->set('status', $status);
$builder->insert();
set()
は、オプションの 3 番目のパラメータ ($escape
) も受け入れます。これを false
に設定すると、値がエスケープされなくなります。違いを示すために、エスケープパラメータありとなしで set()
を使用した例を以下に示します。
<?php
$builder->set('field', 'field+1', false);
$builder->where('id', 2);
$builder->update();
// gives UPDATE mytable SET field = field+1 WHERE `id` = 2
$builder->set('field', 'field+1');
$builder->where('id', 2);
$builder->update();
// gives UPDATE `mytable` SET `field` = 'field+1' WHERE `id` = 2
連想配列をこのメソッドに渡すこともできます。
<?php
$array = [
'name' => $name,
'title' => $title,
'status' => $status,
];
$builder->set($array);
$builder->insert();
またはオブジェクト
<?php
namespace App\Libraries;
class MyClass
{
public $title = 'My Title';
public $content = 'My Content';
public $date = 'My Date';
}
<?php
use App\Libraries\MyClass;
$object = new MyClass();
$builder->set($object);
$builder->insert();
$builder->update()
提供されたデータに基づいて更新文字列を生成し、クエリを実行します。配列またはオブジェクトをメソッドに渡すことができます。以下は配列を使用する例です。
<?php
$data = [
'title' => $title,
'name' => $name,
'date' => $date,
];
$builder->where('id', $id);
$builder->update($data);
/*
* Produces:
* UPDATE mytable
* SET title = '{$title}', name = '{$name}', date = '{$date}'
* WHERE id = $id
*/
または、オブジェクトを渡すこともできます。
<?php
namespace App\Libraries;
class MyClass
{
public $title = 'My Title';
public $content = 'My Content';
public $date = 'My Date';
}
<?php
use App\Libraries\MyClass;
$object = new MyClass();
$builder->where('id', $id);
$builder->update($object);
/*
* Produces:
* UPDATE `mytable`
* SET `title` = '{$title}', `content` = '{$content}', `date` = '{$date}'
* WHERE id = `$id`
*/
注意
RawSql
を除くすべての値は自動的にエスケープされ、より安全なクエリが生成されます。
警告
RawSql
を使用する場合は、手動でデータをエスケープする必要があります。そうしないと、SQLインジェクションが発生する可能性があります。
WHERE 句を設定できるようにする $builder->where()
メソッドの使用に注目してください。オプションで、この情報を文字列として update()
メソッドに直接渡すことができます。
<?php
$builder->update($data, 'id = 4');
または配列として
<?php
$builder->update($data, ['id' => $id]);
更新を実行する際は、上記で説明した $builder->set()
メソッドも使用できます。
$builder->getCompiledUpdate()
これは $builder->getCompiledInsert()
とまったく同じように動作しますが、INSERT SQL 文字列ではなく UPDATE SQL 文字列を生成する点が異なります。
詳細については、$builder->getCompiledInsert() のドキュメントを参照してください。
注意
このメソッドは、バッチ更新には使用できません。
UpdateBatch
$builder->updateBatch()
注意
v4.3.0 以降、updateBatch()
の 2 番目のパラメータ $index
が $constraints
に変更されました。配列、文字列、または RawSql
型を受け入れるようになりました。
データからの更新
提供されたデータに基づいて更新文字列を生成し、クエリを実行します。配列またはオブジェクトをメソッドに渡すことができます。以下は配列を使用する例です。
<?php
$data = [
[
'title' => 'Title 1',
'author' => 'Author 1',
'name' => 'Name 1',
'date' => 'Date 1',
],
[
'title' => 'Title 2',
'author' => 'Author 2',
'name' => 'Name 2',
'date' => 'Date 2',
],
];
$builder->updateBatch($data, ['title', 'author']);
/*
* Produces:
* UPDATE `mytable`
* INNER JOIN (
* SELECT 'Title 1' `title`, 'Author 1' `author`, 'Name 1' `name`, 'Date 1' `date` UNION ALL
* SELECT 'Title 2' `title`, 'Author 2' `author`, 'Name 2' `name`, 'Date 2' `date`
* ) `u`
* ON `mytable`.`title` = `u`.`title` AND `mytable`.`author` = `u`.`author`
* SET
* `mytable`.`title` = `u`.`title`,
* `mytable`.`name` = `u`.`name`,
* `mytable`.`date` = `u`.`date`
*/
最初のパラメータは値の連想配列で、2 番目のパラメータは where キーです。
注意
v4.3.0 以降、生成される SQL 構造が改善されました。
v4.3.0 以降、onConstraint()
および updateFields()
メソッドも使用できます。
<?php
use CodeIgniter\Database\RawSql;
$builder->setData($data)->onConstraint('title, author')->updateBatch();
// OR
$builder->setData($data, null, 'u')
->onConstraint(['`mytable`.`title`' => '`u`.`title`', 'author' => new RawSql('`u`.`author`')])
->updateBatch();
// OR
foreach ($data as $row) {
$builder->setData($row);
}
$builder->onConstraint('title, author')->updateBatch();
// OR
$builder->setData($data, true, 'u')
->onConstraint(new RawSql('`mytable`.`title` = `u`.`title` AND `mytable`.`author` = `u`.`author`'))
->updateFields(['last_update' => new RawSql('CURRENT_TIMESTAMP()')], true)
->updateBatch();
/*
* Produces:
* UPDATE `mytable`
* INNER JOIN (
* SELECT 'Title 1' `title`, 'Author 1' `author`, 'Name 1' `name`, 'Date 1' `date` UNION ALL
* SELECT 'Title 2' `title`, 'Author 2' `author`, 'Name 2' `name`, 'Date 2' `date`
* ) `u`
* ON `mytable`.`title` = `u`.`title` AND `mytable`.`author` = `u`.`author`
* SET
* `mytable`.`title` = `u`.`title`,
* `mytable`.`name` = `u`.`name`,
* `mytable`.`date` = `u`.`date`,
* `mytable`.`last_update` = CURRENT_TIMESTAMP() // this only applies to the last scenario
*/
注意
RawSql
を除くすべての値は自動的にエスケープされ、より安全なクエリが生成されます。
警告
RawSql
を使用する場合は、手動でデータをエスケープする必要があります。そうしないと、SQLインジェクションが発生する可能性があります。
注意
affectedRows()
は、その動作の性質上、このメソッドでは適切な結果が得られません。代わりに、updateBatch()
は影響を受けた行数を返します。
クエリからの更新
v4.3.0 以降、setQueryAsData()
メソッドを使用してクエリから更新することもできます。
<?php
use CodeIgniter\Database\RawSql;
$query = $this->db->table('user2')
->select('user2.name, user2.email, user2.country')
->join('user', 'user.email = user2.email', 'inner')
->where('user2.country', 'US');
$additionalUpdateField = ['updated_at' => new RawSql('CURRENT_TIMESTAMP')];
$sql = $builder->table('user')
->setQueryAsData($query, null, 'u')
->onConstraint('email')
->updateFields($additionalUpdateField, true)
->updateBatch();
/*
* Produces:
* UPDATE `user`
* INNER JOIN (
* SELECT user2.name, user2.email, user2.country
* FROM user2
* INNER JOIN user ON user.email = user2.email
* WHERE user2.country = 'US'
* ) `u`
* ON `user`.`email` = `u`.`email`
* SET
* `mytable`.`name` = `u`.`name`,
* `mytable`.`email` = `u`.`email`,
* `mytable`.`country` = `u`.`country`,
* `mytable`.`updated_at` = CURRENT_TIMESTAMP()
*/
注意
ターゲットテーブルの列と一致するように、select クエリの列にエイリアスを付ける必要があります。
データの削除
削除
$builder->delete()
DELETE SQL 文字列を生成し、クエリを実行します。
<?php
$builder->delete(['id' => $id]);
// Produces: DELETE FROM mytable WHERE id = $id
最初のパラメータは where 句です。メソッドの最初のパラメータにデータを渡す代わりに、where()
または orWhere()
メソッドを使用することもできます。
<?php
$builder->where('id', $id);
$builder->delete();
/*
* Produces:
* DELETE FROM mytable
* WHERE id = $id
*/
テーブルからすべてのデータを削除する場合は、truncate()
メソッドまたは emptyTable()
を使用できます。
$builder->getCompiledDelete()
これは $builder->getCompiledInsert()
とまったく同じように動作しますが、INSERT SQL 文字列ではなく DELETE SQL 文字列を生成する点が異なります。
詳細については、$builder->getCompiledInsert() のドキュメントを参照してください。
DeleteBatch
$builder->deleteBatch()
バージョン 4.3.0 で新規追加されました。
データからの削除
データセットに基づいてバッチ DELETE ステートメントを生成します。
<?php
$data = [
[
'order' => 48372,
'line' => 3,
'product' => 'Keyboard',
'qty' => 1,
],
[
'order' => 48372,
'line' => 4,
'product' => 'Mouse',
'qty' => 1,
],
[
'order' => 48372,
'line' => 5,
'product' => 'Monitor',
'qty' => 2,
],
];
$builder->setData($data, true, 'del')
->onConstraint('order, line')
->where('del.qty >', 1)
->deleteBatch();
/*
* MySQL Produces:
* DELETE `order_line` FROM `order_line`
* INNER JOIN (
* SELECT 3 `line`, 48372 `order`, 'Keyboard' `product`, 1 `qty` UNION ALL
* SELECT 4 `line`, 48372 `order`, 'Mouse' `product`, 1 `qty` UNION ALL
* SELECT 5 `line`, 48372 `order`, 'Monitor' `product`, 2 `qty`
* ) `del`
* ON `order_line`.`order` = `del`.`order` AND `order_line`.`line` = `del`.`line`
* WHERE `del`.`qty` > 1
*/
このメソッドは、複合主キーを持つテーブル内のデータを削除する場合に特に役立ちます。
注意
SQLite3 は where()
の使用をサポートしていません。
クエリからの削除
クエリから削除することもできます。
<?php
use CodeIgniter\Database\RawSql;
$query = $this->db->table('user2')->select('email, name, country')->where('country', 'Greece');
$this->db->table('user')
->setQueryAsData($query, 'alias')
->onConstraint('email')
->where('alias.name = user.name')
->deleteBatch();
/* MySQLi produces:
DELETE `user` FROM `user`
INNER JOIN (
SELECT `email`, `name`, `country`
FROM `user2`
WHERE `country` = 'Greece') `alias`
ON `user`.`email` = `alias`.`email`
WHERE `alias`.`name` = `user`.`name`
*/
$builder->emptyTable()
DELETE SQL 文字列を生成し、クエリを実行します。
<?php
$builder->emptyTable('mytable');
// Produces: DELETE FROM mytable
$builder->truncate()
TRUNCATE SQL 文字列を生成し、クエリを実行します。
<?php
$builder->truncate();
/*
* Produce:
* TRUNCATE mytable
*/
注意
TRUNCATE コマンドが使用できない場合、truncate()
は "DELETE FROM table" として実行されます。
条件付きステートメント
When
$builder->when()
バージョン 4.3.0 で新規追加されました。
これにより、クエリビルダーチェーンを中断することなく、条件に基づいてクエリを変更できます。最初のパラメータは条件で、ブール値に評価される必要があります。2 番目のパラメータは、条件が true の場合に実行される callable です。
たとえば、HTTP リクエスト内で送信された値に基づいて、特定の WHERE ステートメントのみを適用したい場合があります。
<?php
$status = service('request')->getPost('status');
$users = $this->db->table('users')
->when($status, static function ($query, $status) {
$query->where('status', $status);
})
->get();
条件が true
と評価されるため、callable が呼び出されます。条件に設定された値は、クエリで使用できるように、callable の 2 番目のパラメータとして渡されます。
条件が false と評価された場合に、異なるステートメントを適用したい場合があります。これは、2 つ目のクロージャを提供することで実現できます。
<?php
$onlyInactive = service('request')->getPost('return_inactive');
$users = $this->db->table('users')
->when($onlyInactive, static function ($query, $onlyInactive) {
$query->where('status', 'inactive');
}, static function ($query) {
$query->where('status', 'active');
})
->get();
WhenNot
$builder->whenNot()
バージョン 4.3.0 で新規追加されました。
これは $builder->when()
とまったく同じように動作しますが、when()
のように true
の場合にのみ callable を実行するのではなく、条件が false
と評価される場合にのみ callable を実行します。
<?php
$status = service('request')->getPost('status');
$users = $this->db->table('users')
->whenNot($status, static function ($query, $status) {
$query->where('active', 0);
})
->get();
メソッドチェーン
メソッドチェーンを使用すると、複数のメソッドを接続することで構文を簡略化できます。この例を考えてみましょう。
<?php
$query = $builder->select('title')
->where('id', $id)
->limit(10, 20)
->get();
クエリビルダーのリセット
ResetQuery
$builder->resetQuery()
クエリビルダーをリセットすると、$builder->get()
や $builder->insert()
のようなメソッドを使用して最初に実行することなく、クエリを新たに開始できます。
これは、クエリビルダーを使用してSQL(例えば、$builder->getCompiledSelect()
)を生成しているが、その後、例えば、クエリを実行する場合に役立ちます。
<?php
// Note that the parameter of the `getCompiledSelect()` method is false
$sql = $builder->select(['field1', 'field2'])
->where('field3', 5)
->getCompiledSelect(false);
// ...
// Do something crazy with the SQL code... like add it to a cron script for
// later execution or something...
// ...
$data = $builder->get()->getResultArray();
/*
* Would execute and return an array of results of the following query:
* SELECT field1, field2 FROM mytable WHERE field3 = 5;
*/
クラスリファレンス
- class CodeIgniter\Database\BaseBuilder
- db()
- 戻り値:
使用中のデータベース接続
- 戻り値の型:
ConnectionInterface
$db
から現在のデータベース接続を返します。クエリビルダーで直接利用できない、insertID()
やerrors()
のようなConnectionInterface
メソッドにアクセスするのに便利です。
- resetQuery()
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
現在のクエリビルダーの状態をリセットします。特定の条件下でキャンセルできるクエリを作成したい場合に便利です。
- countAllResults([$reset = true])
- パラメータ:
$reset (
bool
) – SELECT句の値をリセットするかどうか
- 戻り値:
クエリ結果の行数
- 戻り値の型:
int
クエリビルダーのクエリによって返されるすべてのレコードをカウントするプラットフォーム固有のクエリ文字列を生成します。
- countAll([$reset = true])
- パラメータ:
$reset (
bool
) – SELECT句の値をリセットするかどうか
- 戻り値:
クエリ結果の行数
- 戻り値の型:
int
特定のテーブル内のすべてのレコードをカウントするプラットフォーム固有のクエリ文字列を生成します。
- get([$limit = null[, $offset = null[, $reset = true]]]])
- パラメータ:
$limit (
int
) – LIMIT句$offset (
int
) – OFFSET句$reset (
bool
) – クエリビルダーの値をクリアするかどうか
- 戻り値:
\CodeIgniter\Database\ResultInterface
インスタンス (メソッドチェーン)- 戻り値の型:
\CodeIgniter\Database\ResultInterface
既に呼び出されたクエリビルダーメソッドに基づいて、
SELECT
ステートメントをコンパイルして実行します。
- getWhere([$where = null[, $limit = null[, $offset = null[, $reset = true]]]]])
- パラメータ:
$where (
string
) – WHERE句$limit (
int
) – LIMIT句$offset (
int
) – OFFSET句$reset (
bool
) – クエリビルダーの値をクリアするかどうか
- 戻り値:
\CodeIgniter\Database\ResultInterface
インスタンス (メソッドチェーン)- 戻り値の型:
\CodeIgniter\Database\ResultInterface
get()
と同じですが、WHERE句を直接追加することもできます。
- select([$select = '*'[, $escape = null]])
- パラメータ:
$select (
array|RawSql|string
) – クエリのSELECT部分$escape (
bool
) – 値と識別子をエスケープするかどうか
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
クエリに
SELECT
句を追加します。
- selectAvg([$select = ''[, $alias = '']])
- パラメータ:
$select (
string
) – 平均を計算するフィールド$alias (
string
) – 結果の値の名前のエイリアス
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
クエリに
SELECT AVG(field)
句を追加します。
- selectMax([$select = ''[, $alias = '']])
- パラメータ:
$select (
string
) – 最大値を計算するフィールド$alias (
string
) – 結果の値の名前のエイリアス
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
クエリに
SELECT MAX(field)
句を追加します。
- selectMin([$select = ''[, $alias = '']])
- パラメータ:
$select (
string
) – 最小値を計算するフィールド$alias (
string
) – 結果の値の名前のエイリアス
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
クエリに
SELECT MIN(field)
句を追加します。
- selectSum([$select = ''[, $alias = '']])
- パラメータ:
$select (
string
) – 合計を計算するフィールド$alias (
string
) – 結果の値の名前のエイリアス
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
クエリに
SELECT SUM(field)
句を追加します。
- selectCount([$select = ''[, $alias = '']])
- パラメータ:
$select (
string
) – 平均を計算するフィールド$alias (
string
) – 結果の値の名前のエイリアス
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
クエリに
SELECT COUNT(field)
句を追加します。
- selectSubquery(BaseBuilder $subquery, string $as)
- パラメータ:
$subquery (
string
) – BaseBuilderのインスタンス$as (
string
) – 結果の値の名前のエイリアス
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
選択にサブクエリを追加します
- distinct([$val = true])
- パラメータ:
$val (
bool
) – "distinct" フラグの希望値
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
クエリビルダーに、クエリの
SELECT
部分にDISTINCT
句を追加するように指示するフラグを設定します。
- from($from[, $overwrite = false])
- パラメータ:
$from (
mixed
) – テーブル名(複数可)。文字列または配列$overwrite (
bool
) – 既存の最初のテーブルを削除する必要があるかどうか
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
クエリの
FROM
句を指定します。
- fromSubquery($from, $alias)
- パラメータ:
$from (
BaseBuilder
) – BaseBuilderクラスのインスタンス$alias (
string
) – サブクエリのエイリアス
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
サブクエリを使用するクエリの
FROM
句を指定します。
- setQueryAsData($query[, $alias[, $columns = null]])
バージョン 4.3.0 で新規追加されました。
- パラメータ:
$query (
BaseBuilder|RawSql
) – BaseBuilderまたはRawSqlのインスタンス$alias (
string|null
) – クエリのエイリアス$columns (
array|string|null
) – クエリ内のカラムの配列またはカンマ区切り文字列
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
insertBatch()
,updateBatch()
,upsertBatch()
のデータソースとしてクエリを設定します。$columns
がnullの場合、カラム名を生成するためにクエリが実行されます。
- join($table, $cond[, $type = ''[, $escape = null]])
- パラメータ:
$table (
string
) – 結合するテーブル名$cond (
string
) – JOIN ON条件$type (
string
) – JOINの種類$escape (
bool
) – 値と識別子をエスケープするかどうか
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
クエリに
JOIN
句を追加します。
- where($key[, $value = null[, $escape = null]])
- パラメータ:
$key (
array|RawSql|string
) – 比較するフィールドの名前、または連想配列$value (
mixed
) – 単一のキーの場合、この値と比較されます$escape (
bool
) – 値と識別子をエスケープするかどうか
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
クエリの
WHERE
部分を生成します。複数の呼び出しをAND
で区切ります。
- orWhere($key[, $value = null[, $escape = null]])
- パラメータ:
$key (
mixed
) – 比較するフィールドの名前、または連想配列$value (
mixed
) – 単一のキーの場合、この値と比較されます$escape (
bool
) – 値と識別子をエスケープするかどうか
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
クエリの
WHERE
部分を生成します。複数の呼び出しをOR
で区切ります。
- orWhereIn([$key = null[, $values = null[, $escape = null]]])
- パラメータ:
$key (
string
) – 検索するフィールド$values (
array|BaseBulder|Closure
) – 対象の値の配列、またはサブクエリの無名関数$escape (
bool
) – 値と識別子をエスケープするかどうか
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
WHERE
フィールドIN('item', 'item')
SQLクエリを生成します。適切であればOR
で結合されます。
- orWhereNotIn([$key = null[, $values = null[, $escape = null]]])
- パラメータ:
$key (
string
) – 検索するフィールド$values (
array|BaseBulder|Closure
) – 対象の値の配列、またはサブクエリの無名関数$escape (
bool
) – 値と識別子をエスケープするかどうか
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
WHERE
フィールドNOT IN('item', 'item')
SQLクエリを生成します。適切であればOR
で結合されます。
- whereIn([$key = null[, $values = null[, $escape = null]]])
- パラメータ:
$key (
string
) – 調べるフィールドの名前$values (
array|BaseBulder|Closure
) – 対象の値の配列、またはサブクエリの無名関数$escape (
bool
) – 値と識別子をエスケープするかどうか
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
WHERE
フィールドIN('item', 'item')
SQLクエリを生成します。適切であればAND
で結合されます。
- whereNotIn([$key = null[, $values = null[, $escape = null]]])
- パラメータ:
$key (
string
) – 調べるフィールドの名前$values (
array|BaseBulder|Closure
) – 対象の値の配列、またはサブクエリの無名関数$escape (
bool
) – 値と識別子をエスケープするかどうか
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
WHERE
フィールドNOT IN('item', 'item')
SQLクエリを生成します。適切であればAND
で結合されます。
- groupStart()
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
グループ式を開始します。内部の条件には
AND
を使用します。
- orGroupStart()
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
グループ式を開始します。内部の条件には
OR
を使用します。
- notGroupStart()
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
グループ式を開始します。内部の条件には
AND NOT
を使用します。
- orNotGroupStart()
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
グループ式を開始します。内部の条件には
OR NOT
を使用します。
- groupEnd()
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
グループ式を終了します。
- like($field[, $match = ''[, $side = 'both'[, $escape = null[, $insensitiveSearch = false]]]])
- パラメータ:
$field (
array|RawSql|string
) – フィールド名$match (
string
) – マッチさせるテキスト部分$side (
string
) – 式のどちら側に「%」ワイルドカードを配置するか$escape (
bool
) – 値と識別子をエスケープするかどうか$insensitiveSearch (
bool
) – 大文字と小文字を区別しない検索を強制するかどうか
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
クエリに
LIKE
句を追加します。複数の呼び出しをAND
で区切ります。
- orLike($field[, $match = ''[, $side = 'both'[, $escape = null[, $insensitiveSearch = false]]]])
- パラメータ:
$field (
string
) – フィールド名$match (
string
) – マッチさせるテキスト部分$side (
string
) – 式のどちら側に「%」ワイルドカードを配置するか$escape (
bool
) – 値と識別子をエスケープするかどうか$insensitiveSearch (
bool
) – 大文字と小文字を区別しない検索を強制するかどうか
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
クエリに
LIKE
句を追加し、複数のクラスをOR
で区切ります。
- notLike($field[, $match = ''[, $side = 'both'[, $escape = null[, $insensitiveSearch = false]]]])
- パラメータ:
$field (
string
) – フィールド名$match (
string
) – マッチさせるテキスト部分$side (
string
) – 式のどちら側に「%」ワイルドカードを配置するか$escape (
bool
) – 値と識別子をエスケープするかどうか$insensitiveSearch (
bool
) – 大文字と小文字を区別しない検索を強制するかどうか
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
クエリに
NOT LIKE
句を追加し、複数の呼び出しをAND
で区切ります。
- orNotLike($field[, $match = ''[, $side = 'both'[, $escape = null[, $insensitiveSearch = false]]]])
- パラメータ:
$field (
string
) – フィールド名$match (
string
) – マッチさせるテキスト部分$side (
string
) – 式のどちら側に「%」ワイルドカードを配置するか$escape (
bool
) – 値と識別子をエスケープするかどうか$insensitiveSearch (
bool
) – 大文字と小文字を区別しない検索を強制するかどうか
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
クエリに
NOT LIKE
句を追加し、複数の呼び出しをOR
で区切ります。
- having($key[, $value = null[, $escape = null]])
- パラメータ:
$key (
mixed
) – 識別子 (文字列) またはフィールド/値のペアの連想配列$value (
string
) – $key が識別子の場合に検索される値$escape (
string
) – 値と識別子をエスケープするかどうか
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
クエリに
HAVING
句を追加し、複数の呼び出しをAND
で区切ります。
- orHaving($key[, $value = null[, $escape = null]])
- パラメータ:
$key (
mixed
) – 識別子 (文字列) またはフィールド/値のペアの連想配列$value (
string
) – $key が識別子の場合に検索される値$escape (
string
) – 値と識別子をエスケープするかどうか
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
クエリに
HAVING
句を追加し、複数の呼び出しをOR
で区切ります。
- orHavingIn([$key = null[, $values = null[, $escape = null]]])
- パラメータ:
$key (
string
) – 検索するフィールド$values (
array|BaseBulder|Closure
) – 対象の値の配列、またはサブクエリの無名関数$escape (
bool
) – 値と識別子をエスケープするかどうか
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
HAVING
フィールド IN('item', 'item') SQL クエリを生成し、必要に応じてOR
で結合します。
- orHavingNotIn([$key = null[, $values = null[, $escape = null]]])
- パラメータ:
$key (
string
) – 検索するフィールド$values (
array|BaseBulder|Closure
) – 対象の値の配列、またはサブクエリの無名関数$escape (
bool
) – 値と識別子をエスケープするかどうか
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
HAVING
フィールドNOT IN('item', 'item')
SQL クエリを生成し、必要に応じてOR
で結合します。
- havingIn([$key = null[, $values = null[, $escape = null]]])
- パラメータ:
$key (
string
) – 調べるフィールドの名前$values (
array|BaseBulder|Closure
) – 対象の値の配列、またはサブクエリの無名関数$escape (
bool
) – 値と識別子をエスケープするかどうか
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
HAVING
フィールドIN('item', 'item')
SQL クエリを生成し、必要に応じてAND
で結合します。
- havingNotIn([$key = null[, $values = null[, $escape = null]]])
- パラメータ:
$key (
string
) – 調べるフィールドの名前$values (
array|BaseBulder|Closure
) – 対象の値の配列、またはサブクエリの無名関数$escape (
bool
) – 値と識別子をエスケープするかどうか$insensitiveSearch (
bool
) – 大文字と小文字を区別しない検索を強制するかどうか
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
HAVING
フィールドNOT IN('item', 'item')
SQL クエリを生成し、必要に応じてAND
で結合します。
- havingLike($field[, $match = ''[, $side = 'both'[, $escape = null[, $insensitiveSearch = false]]]])
- パラメータ:
$field (
string
) – フィールド名$match (
string
) – マッチさせるテキスト部分$side (
string
) – 式のどちら側に「%」ワイルドカードを配置するか$escape (
bool
) – 値と識別子をエスケープするかどうか$insensitiveSearch (
bool
) – 大文字と小文字を区別しない検索を強制するかどうか
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
クエリの
HAVING
部分にLIKE
句を追加し、複数の呼び出しをAND
で区切ります。
- orHavingLike($field[, $match = ''[, $side = 'both'[, $escape = null[, $insensitiveSearch = false]]]])
- パラメータ:
$field (
string
) – フィールド名$match (
string
) – マッチさせるテキスト部分$side (
string
) – 式のどちら側に「%」ワイルドカードを配置するか$escape (
bool
) – 値と識別子をエスケープするかどうか$insensitiveSearch (
bool
) – 大文字と小文字を区別しない検索を強制するかどうか
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
クエリの
HAVING
部分にLIKE
句を追加し、複数のクラスをOR
で区切ります。
- notHavingLike($field[, $match = ''[, $side = 'both'[, $escape = null[, $insensitiveSearch = false]]]])
- パラメータ:
$field (
string
) – フィールド名$match (
string
) – マッチさせるテキスト部分$side (
string
) – 式のどちら側に「%」ワイルドカードを配置するか$escape (
bool
) – 値と識別子をエスケープするかどうか$insensitiveSearch (
bool
) – 大文字と小文字を区別しない検索を強制するかどうか
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
クエリの
HAVING
部分にNOT LIKE
句を追加し、複数の呼び出しをAND
で区切ります。
- orNotHavingLike($field[, $match = ''[, $side = 'both'[, $escape = null[, $insensitiveSearch = false]]]])
- パラメータ:
$field (
string
) – フィールド名$match (
string
) – マッチさせるテキスト部分$side (
string
) – 式のどちら側に「%」ワイルドカードを配置するか$escape (
bool
) – 値と識別子をエスケープするかどうか
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
クエリの
HAVING
部分にNOT LIKE
句を追加し、複数の呼び出しをOR
で区切ります。
- havingGroupStart()
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
HAVING
句のグループ式を開始し、その中の条件にはAND
を使用します。
- orHavingGroupStart()
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
HAVING
句のグループ式を開始します。内部の条件にはOR
を使用します。
- notHavingGroupStart()
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
HAVING
句のグループ式を開始します。内部の条件にはAND NOT
を使用します。
- orNotHavingGroupStart()
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
HAVING
句のグループ式を開始します。内部の条件にはOR NOT
を使用します。
- havingGroupEnd()
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
HAVING
句のグループ式を終了します。
- groupBy($by[, $escape = null])
- パラメータ:
$by (
mixed
) – グループ化するフィールド。文字列または配列。
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
クエリに
GROUP BY
句を追加します。
- orderBy($orderby[, $direction = ''[, $escape = null]])
- パラメータ:
$orderby (
string
) – 並び替えの基準となるフィールド$direction (
string
) – 並び替えの順序 - ASC、DESC、または random$escape (
bool
) – 値と識別子をエスケープするかどうか
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
クエリに
ORDER BY
句を追加します。
- limit($value[, $offset = 0])
- パラメータ:
$value (
int
) – 結果を制限する行数$offset (
int
) – スキップする行数
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
クエリに
LIMIT
句とOFFSET
句を追加します。
- offset($offset)
- パラメータ:
$offset (
int
) – スキップする行数
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
クエリに
OFFSET
句を追加します。
- union($union)
- パラメータ:
$union (
BaseBulder|Closure
) – UNIONクエリ
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
UNION
句を追加します。
- unionAll($union)
- パラメータ:
$union (
BaseBulder|Closure
) – UNIONクエリ
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
UNION ALL
句を追加します。
- set($key[, $value = ''[, $escape = null]])
- パラメータ:
$key (
mixed
) – フィールド名、またはフィールドと値のペアの配列$value (
mixed
) – $key が単一フィールドの場合のフィールド値$escape (
bool
) – 値をエスケープするかどうか
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
後で
insert()
、update()
、またはreplace()
に渡されるフィールドと値のペアを追加します。
- insert([$set = null[, $escape = null]])
- パラメータ:
$set (
array
) – フィールドと値のペアの連想配列$escape (
bool
) – 値をエスケープするかどうか
- 戻り値:
成功時に
true
、失敗時にfalse
- 戻り値の型:
bool
INSERT
ステートメントをコンパイルして実行します。
- insertBatch([$set = null[, $escape = null[, $batch_size = 100]]])
- パラメータ:
$set (
array
) – 挿入するデータ$escape (
bool
) – 値をエスケープするかどうか$batch_size (
int
) – 一度に挿入する行数
- 戻り値:
挿入された行数、または失敗時に
false
- 戻り値の型:
int|false
バッチ
INSERT
ステートメントをコンパイルして実行します。注意
$batch_size
を超える行数が指定された場合、複数のINSERT
クエリが実行され、それぞれが最大$batch_size
行の挿入を試みます。
- setInsertBatch($key[, $value = ''[, $escape = null]])
バージョン 4.3.0 から非推奨: 代わりに
CodeIgniter\Database\BaseBuilder::setData()
を使用してください。- パラメータ:
$key (
mixed
) – フィールド名またはフィールドと値のペアの配列$value (
string
) – $key が単一フィールドの場合のフィールド値$escape (
bool
) – 値をエスケープするかどうか
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
後で
insertBatch()
を介してテーブルに挿入されるフィールドと値のペアを追加します。重要
このメソッドは非推奨です。将来のリリースで削除されます。
- upsert([$set = null[, $escape = null]])
- パラメータ:
$set (
array
) – フィールドと値のペアの連想配列$escape (
bool
) – 値をエスケープするかどうか
- 戻り値:
成功時に
true
、失敗時にfalse
- 戻り値の型:
bool
UPSERT
ステートメントをコンパイルして実行します。
- upsertBatch([$set = null[, $escape = null[, $batch_size = 100]]])
- パラメータ:
$set (
array
) – アップサートするデータ$escape (
bool
) – 値をエスケープするかどうか$batch_size (
int
) – 一度にアップサートする行数
- 戻り値:
アップサートされた行数、または失敗時に
false
- 戻り値の型:
int|false
バッチ
UPSERT
ステートメントをコンパイルして実行します。注意
MySQLは
ON DUPLICATE KEY UPDATE
を使用します。行が新しい行として挿入された場合、影響を受けた行の値は1、既存の行が更新された場合は2、既存の行が現在の値に設定された場合は0です。注意
$batch_size
行を超える行が提供された場合、複数のUPSERT
クエリが実行され、それぞれが最大$batch_size
行の upsert を試みます。
- update([$set = null[, $where = null[, $limit = null]]])
- パラメータ:
$set (
array
) – フィールドと値のペアの連想配列$where (
string
) – WHERE句$limit (
int
) – LIMIT句
- 戻り値:
成功時に
true
、失敗時にfalse
- 戻り値の型:
bool
UPDATE
ステートメントをコンパイルして実行します。
- updateBatch([$set = null[, $constraints = null[, $batchSize = 100]]])
- パラメータ:
$set (
array|object|null
) – フィールド名、またはフィールド/値のペアの連想配列$constraints (
array|RawSql|string|null
) – 更新のキーとして使用されるフィールドまたはフィールド群。$batchSize (
int
) – 単一のクエリでグループ化する条件の数
- 戻り値:
更新された行数、または失敗した場合は
false
- 戻り値の型:
int|false
注意
v4.3.0 以降、パラメータ
$set
および$constraints
の型が変更されました。バッチ
UPDATE
ステートメントをコンパイルして実行します。$constraints
パラメータは、カンマ区切りの列文字列、配列、連想配列、またはRawSql
を受け取ります。注意
$batchSize
を超えるフィールド/値のペアが提供された場合、複数のクエリが実行され、それぞれが最大$batchSize
個のフィールド/値のペアを処理します。$batchSize
を 0 に設定すると、すべてのフィールド/値のペアが 1 つのクエリで実行されます。
- updateFields($set[, $addToDefault = false[, $ignore = null]])
バージョン 4.3.0 で新規追加されました。
- パラメータ:
$set (
mixed
) – 列の行または行の配列。行は配列またはオブジェクトです。$addToDefault (
bool
) – データセット内の列よりも追加の列を追加します。$ignore (
bool
) – $set 内の列から無視する列の配列
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
updateBatch()
およびupsertBatch()
メソッドで使用されます。これは更新されるフィールドを定義します。
- onConstraint($set)
バージョン 4.3.0 で新規追加されました。
- パラメータ:
$set (
mixed
) – キーまたは制約として使用されるフィールドまたはフィールドのセット。
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
updateBatch()
およびupsertBatch()
メソッドで使用されます。これは、カンマ区切りの列文字列、配列、連想配列、または RawSql を受け取ります。
- setData($set[, $escape = null[, $alias = '']])
バージョン 4.3.0 で新規追加されました。
- パラメータ:
$set (
mixed
) – 列の行または行の配列。行は配列またはオブジェクトです。$escape (
bool
) – 値をエスケープするかどうか$alias (
bool
) – データセットのテーブルエイリアス
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
insert、update、upsert のデータを設定するために
*Batch()
メソッドで使用されます。
- setUpdateBatch($key[, $value = ''[, $escape = null]])
バージョン 4.3.0 から非推奨: 代わりに
CodeIgniter\Database\BaseBuilder::setData()
を使用してください。- パラメータ:
$key (
mixed
) – フィールド名またはフィールドと値のペアの配列$value (
string
) – $key が単一フィールドの場合のフィールド値$escape (
bool
) – 値をエスケープするかどうか
- 戻り値:
BaseBuilder
インスタンス (メソッドチェーン)- 戻り値の型:
BaseBuilder
updateBatch()
を介して後でテーブルで更新されるフィールド/値のペアを追加します。重要
このメソッドは非推奨です。将来のリリースで削除されます。
- replace([$set = null])
- パラメータ:
$set (
array
) – フィールドと値のペアの連想配列
- 戻り値:
成功時に
true
、失敗時にfalse
- 戻り値の型:
bool
REPLACE
ステートメントをコンパイルして実行します。
- delete([$where = ''[, $limit = null[, $reset_data = true]]])
- パラメータ:
$where (
string
) – WHERE句$limit (
int
) – LIMIT句$reset_data (
bool
) – クエリの「write」句をリセットする場合は true
- 戻り値:
BaseBuilder
インスタンス(メソッドチェーン)または失敗の場合はfalse
- 戻り値の型:
BaseBuilder|false
DELETE
クエリをコンパイルして実行します。
- deleteBatch([$set = null[, $constraints = null[, $batchSize = 100]]])
- パラメータ:
$set (
array|object|null
) – フィールド名、またはフィールド/値のペアの連想配列$constraints (
array|RawSql|string|null
) – 削除のキーとして使用されるフィールドまたはフィールド群。$batchSize (
int
) – 単一のクエリでグループ化する条件の数
- 戻り値:
削除された行数、または失敗した場合は
false
- 戻り値の型:
int|false
バッチ
DELETE
クエリをコンパイルして実行します。
- increment($column[, $value = 1])
- パラメータ:
$column (
string
) – インクリメントする列の名前$value (
int
) – 列をインクリメントする量
フィールドの値を指定された量だけインクリメントします。フィールドが
VARCHAR
のような数値フィールドでない場合は、$value
に置き換えられる可能性があります。
- decrement($column[, $value = 1])
- パラメータ:
$column (
string
) – デクリメントする列の名前$value (
int
) – 列をデクリメントする量
フィールドの値を指定された量だけデクリメントします。フィールドが
VARCHAR
のような数値フィールドでない場合は、$value
に置き換えられる可能性があります。
- truncate()
- 戻り値:
true
成功時、false
失敗時、テストモード時は文字列- 戻り値の型:
bool|string
テーブルに対して
TRUNCATE
ステートメントを実行します。注意
使用中のデータベースプラットフォームが
TRUNCATE
をサポートしていない場合、代わりにDELETE
ステートメントが使用されます。
- emptyTable()
- 戻り値:
成功時に
true
、失敗時にfalse
- 戻り値の型:
bool
DELETE
ステートメントを介して、テーブルからすべてのレコードを削除します。
- getCompiledSelect([$reset = true])
- パラメータ:
$reset (
bool
) – 現在のQBの値をリセットするかどうか
- 戻り値:
コンパイルされたSQLステートメントを文字列として
- 戻り値の型:
string
SELECT
ステートメントをコンパイルし、文字列として返します。
- getCompiledInsert([$reset = true])
- パラメータ:
$reset (
bool
) – 現在のQBの値をリセットするかどうか
- 戻り値:
コンパイルされたSQLステートメントを文字列として
- 戻り値の型:
string
INSERT
ステートメントをコンパイルし、文字列として返します。
- getCompiledUpdate([$reset = true])
- パラメータ:
$reset (
bool
) – 現在のQBの値をリセットするかどうか
- 戻り値:
コンパイルされたSQLステートメントを文字列として
- 戻り値の型:
string
UPDATE
ステートメントをコンパイルし、文字列として返します。
- getCompiledDelete([$reset = true])
- パラメータ:
$reset (
bool
) – 現在のQBの値をリセットするかどうか
- 戻り値:
コンパイルされたSQLステートメントを文字列として
- 戻り値の型:
string
DELETE
ステートメントをコンパイルし、文字列として返します。