目次
1. はじめに
2. 結果セットを取得します
テーブルからすべての行を取得します
テーブルから行/列を取得します
テーブルからチャンク化された結果セットを取得します
データ列値のリストを取得します
集計関数
3. クエリ (選択)
クエリ句を指定します
場合によっては、これらの式は文字列の形式でクエリに挿入されます。 SQL インジェクションを避けるように特に注意してください。ネイティブ式を作成するには、DB::raw メソッドを使用します。
内部結合 (等価結合)
クエリ ビルダーは、基本的な SQL の「内部結合」を作成するためにも使用できます。結合メソッドに渡される最初のパラメーターは、結合する必要があるテーブル名です。残りの他のパラメーターは、結合に指定された列制約です。もちろん、ご覧のとおり、単一のクエリで複数のテーブルを結合できます。
「内部結合」の代わりに「左結合」を実行したい場合は、leftJoin メソッドを使用できます。このメソッドは join メソッドと同じ方法で使用されます。
メソッドとしてクロージャを join メソッドに渡して、より高度な join 句を指定することもできます。 2 番目のパラメータとして、クロージャは結合句の制約を指定できる JoinClause オブジェクトを返します。
クエリ ビルダーには、「union」へのショートカットも用意されています。たとえば、2 つのクエリを作成し、次に Union メソッドを使用して 2 番目のクエリと結合したい場合:
6、Where子句
简单where子句
or
更多Where子句
高级Where子句
7、排序、分组、限定
orderBy
groupBy / having / havingRaw
skip / take
8、插入(Insert)
自增ID
9、更新(Update)
增加/减少
10、删除(Delete)
11、悲观锁
ホームページ バックエンド開発 PHPチュートリアル [ Laravel 5.2 ドキュメント ] データベース -- クエリビルダー

[ Laravel 5.2 ドキュメント ] データベース -- クエリビルダー

Jun 20, 2016 pm 12:40 PM

1. はじめに

データベース クエリ ビルダーは、データベース クエリを作成および実行するための便利でスムーズなインターフェイスを提供します。クエリ ビルダーを使用すると、アプリケーションでほとんどのデータベース操作を実行でき、サポートされているすべてのデータベース システムで動作します。

注: Laravel クエリビルダーは PDO パラメーター バインディングを使用して SQL インジェクション攻撃を回避し、バインディングに渡される文字列をフィルターする必要がなくなります。

2. 結果セットを取得します

テーブルからすべての行を取得します

クエリを実行する前に、DB ファサードのテーブル メソッドを使用しますこのメソッドは、指定されたテーブルのクエリ ビルダーを返します。これにより、クエリに対してさらに多くの制約を連鎖させ、最終的にクエリ結果を返すことができます。この例では、get メソッドを使用してテーブル内のすべてのレコードを取得します。

<?phpnamespace App\Http\Controllers;use DB;use App\Http\Controllers\Controller;class UserController extends Controller{    /**     * 显示用户列表     *     * @return Response     */    public function index()    {        $users = DB::table('users')->get();        return view('user.index', ['users' => $users]);    }}
ログイン後にコピー

ネイティブ クエリと同様に、get メソッドは結果セットの配列を返します。各結果は次の StdClass インスタンスです。 PHP オブジェクト。オブジェクトのプロパティと同じように列の値にアクセスできます。

foreach ($users as $user) {    echo $user->name;}
ログイン後にコピー

テーブルから行/列を取得します

単にデータの行を取得したい場合テーブルの場合、最初のメソッドを使用できます。このメソッドは単一の StdClass オブジェクトを返します。

$user = DB::table('users')->where('name', 'John')->first();echo $user->name;
ログイン後にコピー

完全な行が必要ない場合は、value メソッドを使用して、テーブルから単一の値を取得できます。 result、指定された列の値を直接返します:

$email = DB::table('users')->where('name', 'John')->value('email');
ログイン後にコピー

テーブルからチャンク化された結果セットを取得します

数千または数百のデータベース レコードを処理する必要がある場合は、次のことを検討できます。チャンク メソッドを使用します。このメソッドは、タイム ブロックで結果セットの小さな部分を取得し、その後、処理する各小さなデータをクロージャに埋め込みます。このメソッドは、大量のデータベース レコードを処理するアーティザン コマンドを作成する場合に非常に便利です。 。たとえば、users テーブルのデータ全体を、一度に 100 レコードを処理する小さなチャンクに処理できます:

DB::table('users')->chunk(100, function($users) {    foreach ($users as $user) {        //    }});
ログイン後にコピー

クロージャ関数から false を返すことで、チャンクの実行を中止できます:

DB::table('users')->chunk(100, function($users) {    // 处理结果集...    return false;});
ログイン後にコピー

データ列値のリストを取得します

単一の列値を含む配列を取得したい場合は、lists メソッドを使用できます。この場合、すべてのタイトルの配列を取得します。 :

$titles = DB::table('roles')->lists('title');foreach ($titles as $title) {    echo $title;}
ログイン後にコピー

返された配列の列値にさらにカスタム キーを指定することもできます (カスタム キーはテーブル内の他のフィールドの列名である必要があります。そうでない場合はエラーが報告されます)。

$roles = DB::table('roles')->lists('title', 'name');foreach ($roles as $name => $title) {    echo $title;}
ログイン後にコピー

集計関数

キュー ビルダーには、count、max、min、avg、sum などの多数の集計メソッドも用意されており、クエリの作成後に呼び出すことができます。

$users = DB::table('users')->count();$price = DB::table('orders')->max('price');
ログイン後にコピー

もちろん、他のクエリ句と集計関数を組み合わせてクエリを構築することもできます。

$price = DB::table('orders')                ->where('finalized', 1)                ->avg('price');
ログイン後にコピー

3. クエリ (選択)

クエリ句を指定します

もちろん、常にデータ テーブルのすべての列を取得する必要はありません。select メソッドを使用して、クエリにカスタムの select 句を指定できます。 🎜>

Different メソッドを使用すると、クエリが重複した結果セットを返さないように強制できます:
$users = DB::table('users')->select('name', 'email as user_email')->get();
ログイン後にコピー

既にクエリ ビルダー インスタンスがあり、既存の select 句にクエリ列を追加したい場合
$users = DB::table('users')->distinct()->get();
ログイン後にコピー

ネイティブ式
$query = DB::table('users')->select('name');$users = $query->addSelect('age')->get();
ログイン後にコピー

場合によっては、これらの式は文字列の形式でクエリに挿入されます。 SQL インジェクションを避けるように特に注意してください。ネイティブ式を作成するには、DB::raw メソッドを使用します。

$users = DB::table('users')                     ->select(DB::raw('count(*) as user_count, status'))                     ->where('status', '<>', 1)                     ->groupBy('status')                     ->get();
ログイン後にコピー
4. 結合

内部結合 (等価結合)

クエリ ビルダーは、基本的な SQL の「内部結合」を作成するためにも使用できます。結合メソッドに渡される最初のパラメーターは、結合する必要があるテーブル名です。残りの他のパラメーターは、結合に指定された列制約です。もちろん、ご覧のとおり、単一のクエリで複数のテーブルを結合できます。

Left Join
$users = DB::table('users')            ->join('contacts', 'users.id', '=', 'contacts.user_id')            ->join('orders', 'users.id', '=', 'orders.user_id')            ->select('users.*', 'contacts.phone', 'orders.price')            ->get();
ログイン後にコピー

「内部結合」の代わりに「左結合」を実行したい場合は、leftJoin メソッドを使用できます。このメソッドは join メソッドと同じ方法で使用されます。

高度な join ステートメント
$users = DB::table('users')            ->leftJoin('posts', 'users.id', '=', 'posts.user_id')            ->get();
ログイン後にコピー

メソッドとしてクロージャを join メソッドに渡して、より高度な join 句を指定することもできます。 2 番目のパラメータとして、クロージャは結合句の制約を指定できる JoinClause オブジェクトを返します。

結合で "where" スタイル句を使用したい場合は、where と orWhere を使用できます。クエリ内のメソッド。これらのメソッドは、列と列ではなく、列と値を比較します。
DB::table('users')        ->join('contacts', function ($join) {            $join->on('users.id', '=', 'contacts.user_id')->orOn(...);        })        ->get();
ログイン後にコピー

DB::table('users')        ->join('contacts', function ($join) {            $join->on('users.id', '=', 'contacts.user_id')                 ->where('contacts.user_id', '>', 5);        })        ->get();
ログイン後にコピー
5. Union

クエリ ビルダーには、「union」へのショートカットも用意されています。たとえば、2 つのクエリを作成し、次に Union メソッドを使用して 2 番目のクエリと結合したい場合:

UnionAll メソッドも有効で、使用方法は同じです。組合として。
$first = DB::table('users')            ->whereNull('first_name');$users = DB::table('users')            ->whereNull('last_name')            ->union($first)            ->get();
ログイン後にコピー

6、Where子句

简单where子句

使用查询构建器上的 where方法可以添加 where子句到查询中,调用 where最基本的方法需要三个参数,第一个参数是列名,第二个参数是一个数据库系统支持的任意操作符,第三个参数是该列要比较的值。

例如,下面是一个验证“votes”列的值是否等于100的查询:

$users = DB::table('users')->where('votes', '=', 100)->get();
ログイン後にコピー

为了方便,如果你只是简单比较列值和给定数值是否相等,可以将数值直接作为 where方法的第二个参数:

$users = DB::table('users')->where('votes', 100)->get();
ログイン後にコピー

当然,你可以使用其它操作符来编写 where子句:

$users = DB::table('users')                ->where('votes', '>=', 100)                ->get();$users = DB::table('users')                ->where('votes', '<>', 100)                ->get();$users = DB::table('users')                ->where('name', 'like', 'T%')                ->get();
ログイン後にコピー

or

你可以通过方法链将多个 where约束链接到一起,也可以添加 or子句到查询, orWhere方法和 where方法接收参数一样:

$users = DB::table('users')                    ->where('votes', '>', 100)                    ->orWhere('name', 'John')                    ->get();
ログイン後にコピー

更多Where子句

whereBetween

whereBetween方法验证列值是否在给定值之间:

$users = DB::table('users')                    ->whereBetween('votes', [1, 100])->get();
ログイン後にコピー

whereNotBetween

whereNotBetween方法验证列值不在给定值之间:

$users = DB::table('users')                    ->whereNotBetween('votes', [1, 100])                    ->get();
ログイン後にコピー

whereIn/whereNotIn

whereIn方法验证给定列的值是否在给定数组中:

$users = DB::table('users')                    ->whereIn('id', [1, 2, 3])                    ->get();
ログイン後にコピー

whereNotIn方法验证给定列的值不在给定数组中:

$users = DB::table('users')                    ->whereNotIn('id', [1, 2, 3])                    ->get();
ログイン後にコピー

whereNull/whereNotNull

whereNull方法验证给定列的值为NULL:

$users = DB::table('users')                    ->whereNull('updated_at')                    ->get();
ログイン後にコピー

whereNotNull方法验证给定列的值不是NULL:

$users = DB::table('users')                    ->whereNotNull('updated_at')                    ->get();
ログイン後にコピー

高级Where子句

参数 分组

有时候你需要创建更加高级的 where子句比如“where exists”或者嵌套的参数分组。Laravel查询构建器也可以处理这些。作为开始,让我们看一个在括号中进行分组约束的例子:

DB::table('users')            ->where('name', '=', 'John')            ->orWhere(function ($query) {                $query->where('votes', '>', 100)                      ->where('title', '<>', 'Admin');            })            ->get();
ログイン後にコピー

正如你所看到的,传递闭包到 orWhere方法构造查询构建器来开始一个约束分组,,该闭包将会获取一个用于设置括号中包含的约束的查询构建器实例。上述语句等价于下面的SQL:

select * from users where name = 'John' or (votes > 100 and title <> 'Admin')
ログイン後にコピー

exists语句

whereExists方法允许你编写 where existSQL子句, whereExists方法接收一个闭包参数,该闭包获取一个查询构建器实例从而允许你定义放置在“exists”子句中的查询:

DB::table('users')            ->whereExists(function ($query) {                $query->select(DB::raw(1))                      ->from('orders')                      ->whereRaw('orders.user_id = users.id');            })            ->get();
ログイン後にコピー

上述查询等价于下面的SQL语句:

select * from userswhere exists (    select 1 from orders where orders.user_id = users.id)
ログイン後にコピー

7、排序、分组、限定

orderBy

orderBy方法允许你通过给定列对结果集进行排序, orderBy的第一个参数应该是你希望排序的列,第二个参数控制着排序的方向——asc或desc:

$users = DB::table('users')                ->orderBy('name', 'desc')                ->get();
ログイン後にコピー

groupBy / having / havingRaw

groupBy和 having方法用于对结果集进行分组, having方法和 where方法的用法类似:

$users = DB::table('users')                ->groupBy('account_id')                ->having('account_id', '>', 100)                ->get();
ログイン後にコピー

havingRaw方法可以用于设置原生字符串作为 having子句的值,例如,我们要找到所有售价大于 $2500的部分:

$users = DB::table('orders')                ->select('department', DB::raw('SUM(price) as total_sales'))                ->groupBy('department')                ->havingRaw('SUM(price) > 2500')                ->get();
ログイン後にコピー

skip / take

想要限定查询返回的结果集的数目,或者在查询中跳过给定数目的结果,可以使用 skip和 take方法:

$users = DB::table('users')->skip(10)->take(5)->get();
ログイン後にコピー

8、插入(Insert)

查询构建器还提供了 insert方法来插入记录到数据表。 insert方法接收数组形式的列名和值进行插入操作:

DB::table('users')->insert(    ['email' => 'john@example.com', 'votes' => 0]);
ログイン後にコピー

你甚至可以一次性通过传入多个数组来插入多条记录,每个数组代表要插入数据表的记录:

DB::table('users')->insert([    ['email' => 'taylor@example.com', 'votes' => 0],    ['email' => 'dayle@example.com', 'votes' => 0]]);
ログイン後にコピー

自增ID

如果数据表有自增ID,使用 insertGetId方法来插入记录将会返回ID值:

$id = DB::table('users')->insertGetId(    ['email' => 'john@example.com', 'votes' => 0]);
ログイン後にコピー

注意:当使用 PostgresSQL时 insertGetId方法默认自增列被命名为 id,如果你想要从其他“序列”获取ID,可以将序列名作为第二个参数传递到 insertGetId方法。

9、更新(Update)

当然,除了插入记录到数据库,查询构建器还可以通过使用 update方法更新已有记录。 update方法和 insert方法一样,接收列和值的键值对数组包含要更新的列,你可以通过 where子句来对 update查询进行约束:

DB::table('users')            ->where('id', 1)            ->update(['votes' => 1]);
ログイン後にコピー

增加/减少

查询构建器还提供了方便增减给定列名数值的方法。相较于编写 update语句,这是一条捷径,提供了更好的体验和测试接口。

这两个方法都至少接收一个参数:需要修改的列。第二个参数是可选的,用于控制列值增加/减少的数目。

DB::table('users')->increment('votes');DB::table('users')->increment('votes', 5);DB::table('users')->decrement('votes');DB::table('users')->decrement('votes', 5);
ログイン後にコピー

在操作过程中你还可以指定额外的列进行更新:

DB::table('users')->increment('votes', 1, ['name' => 'John']);
ログイン後にコピー

10、删除(Delete)

当然,查询构建器还可以通过 delete方法从表中删除记录:

DB::table('users')->delete();
ログイン後にコピー

在调用 delete方法之前可以通过添加 where子句对 delete语句进行约束:

DB::table('users')->where('votes', '<', 100)->delete();
ログイン後にコピー

如果你希望清除整张表,也就是删除所有列并将自增ID置为0,可以使用 truncate方法:

DB::table('users')->truncate();
ログイン後にコピー

11、悲观锁

查询构建器还包含一些方法帮助你在select语句中实现“悲观锁”。可以在查询中使用 sharedLock方法从而在运行语句时带一把”共享锁“。共享锁可以避免被选择的行被修改直到事务提交:

DB::table('users')->where('votes', '>', 100)->sharedLock()->get();
ログイン後にコピー

此外你还可以使用 lockForUpdate方法。“for update”锁避免选择行被其它共享锁修改或删除:

DB::table('users')->where('votes', '>', 100)->lockForUpdate()->get();
ログイン後にコピー
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

PHPにおける後期静的結合の概念を説明します。 PHPにおける後期静的結合の概念を説明します。 Mar 21, 2025 pm 01:33 PM

記事では、PHP 5.3で導入されたPHPの後期静的結合(LSB)について説明し、より柔軟な継承を求める静的メソッドコールのランタイム解像度を可能にします。 LSBの実用的なアプリケーションと潜在的なパフォーマ

フレームワークセキュリティ機能:脆弱性から保護します。 フレームワークセキュリティ機能:脆弱性から保護します。 Mar 28, 2025 pm 05:11 PM

記事では、入力検証、認証、定期的な更新など、脆弱性から保護するためのフレームワークの重要なセキュリティ機能について説明します。

PHPのCurlライブラリを使用してJSONデータを含むPOSTリクエストを送信する方法は? PHPのCurlライブラリを使用してJSONデータを含むPOSTリクエストを送信する方法は? Apr 01, 2025 pm 03:12 PM

PHP開発でPHPのCurlライブラリを使用してJSONデータを送信すると、外部APIと対話する必要があることがよくあります。一般的な方法の1つは、Curlライブラリを使用して投稿を送信することです。

フレームワークのカスタマイズ/拡張:カスタム機能を追加する方法。 フレームワークのカスタマイズ/拡張:カスタム機能を追加する方法。 Mar 28, 2025 pm 05:12 PM

この記事では、フレームワークにカスタム機能を追加し、アーキテクチャの理解、拡張ポイントの識別、統合とデバッグのベストプラクティスに焦点を当てています。

確固たる原則と、それらがPHP開発にどのように適用されるかを説明してください。 確固たる原則と、それらがPHP開発にどのように適用されるかを説明してください。 Apr 03, 2025 am 12:04 AM

PHP開発における固体原理の適用には、次のものが含まれます。1。単一責任原則(SRP):各クラスは1つの機能のみを担当します。 2。オープンおよびクローズ原理(OCP):変更は、変更ではなく拡張によって達成されます。 3。Lischの代替原則(LSP):サブクラスは、プログラムの精度に影響を与えることなく、基本クラスを置き換えることができます。 4。インターフェイス分離原理(ISP):依存関係や未使用の方法を避けるために、細粒インターフェイスを使用します。 5。依存関係の反転原理(DIP):高レベルのモジュールと低レベルのモジュールは抽象化に依存し、依存関係噴射を通じて実装されます。

セッションのハイジャックはどのように機能し、どのようにPHPでそれを軽減できますか? セッションのハイジャックはどのように機能し、どのようにPHPでそれを軽減できますか? Apr 06, 2025 am 12:02 AM

セッションハイジャックは、次の手順で達成できます。1。セッションIDを取得します。2。セッションIDを使用します。3。セッションをアクティブに保ちます。 PHPでのセッションハイジャックを防ぐための方法には次のものが含まれます。1。セッション_regenerate_id()関数を使用して、セッションIDを再生します。2。データベースを介してストアセッションデータを3。

See all articles