クエリビルダー クラス

CodeIgniter では、クエリビルダー クラスにアクセスできます。このパターンを使用すると、最小限のスクリプトでデータベース内の情報を取得、挿入、および更新できます。場合によっては、データベース操作を実行するために 1 つまたは 2 つのコード行のみが必要になります。CodeIgniter では、各データベーステーブルが独自のクラスファイルである必要はありません。代わりに、より簡素化されたインターフェースを提供します。

簡素さだけでなく、クエリビルダー機能を使用する主な利点は、クエリ構文が各データベースアダプターによって生成されるため、データベースに依存しないアプリケーションを作成できることです。また、値がシステムによって自動的にエスケープされるため、より安全なクエリも可能です。

注意

CodeIgniter では、データベース、テーブル、および列名にドット (.) を使用できません。

SQL インジェクション保護

クエリビルダーを使用すると、SQL ステートメントを非常に安全に生成できます。ただし、渡すデータに関係なく、SQL インジェクションを防ぐように設計されていません。

クエリビルダーに渡される引数は、次のいずれかになります。
  1. フィールド(またはテーブル)名などの識別子

  2. それらの

  3. 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番目のパラメーターで指定できます。オプションは、 leftrightouterinnerleft 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番目の引数を使用できます。オプションは、 beforeafter 、および 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番目の引数を使用できます。オプションは、 beforeafter 、および 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番目のパラメータでは、結果の方向を設定できます。オプションは ASCDESC、および 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 をメソッドに渡すことができます。また、insertBatchupdate、および 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ステートメントをコンパイルし、文字列として返します。