開発者ドキュメント

LaravelEloquentでクエリ結果を注文する方法

このシリーズの前のパートでは、データベースレコードを使用してデータベースレコードを取得する方法を学習しました。 all() Eloquentモデル内からのメソッド。 と呼ばれる方法を使用して思い出すことができます sortDesc()、レコードを降順で並べ替えるために使用されました。

The sortDesc() メソッドはCollectionクラスの一部であり、ネイティブPHP配列の改良版として機能する強力なLaravelユーティリティクラスです。 このメソッドは、データベースクエリ自体の中で結果を並べ替える代わりに、コレクションの順序を逆にして、最後のアイテムがコレクションの最初に表示されるようにします。 これは小さな結果セットには適していますが、データベースクエリ自体で結果を並べ替えるのと同じ柔軟性はありません。

データベースクエリで結果を並べ替えるには、 orderBy() メソッドを指定し、順序付けの基準として使用するテーブルフィールドを指定します。 これにより、データベースから必要な結果のみを取得するクエリをより柔軟に構築できるようになります。

次に、コードを変更します routes/web.php に基づいて、新しいものから古いものの順に並べられた結果を表示するファイル created_at テーブルフィールド。

両方 created_at そしてその updated_at 次の項目を含めると、フィールドはEloquentによって管理されます。 timestamps() テーブル移行での定義。 これらのフィールドを手動で更新しないでください。ただし、これらのフィールドを使用して、クエリを並べ替えたりフィルタリングしたりできます。

コードエディタでこのファイルを開きます。

routes/web.php

コードは次のようになります。

ルート/web.php
<?php
 
use Illuminate\Support\Facades\Route;
use App\Models\Link;
use App\Models\LinkList;
 
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
 
Route::get('/', function () {
    $links = Link::all()->sortDesc();
    return view('index', [
        'links' => $links,
        'lists' => LinkList::all()
    ]);
});
 
Route::get('/{slug}', function ($slug) {
    $list = LinkList::where('slug', $slug)->first();
    if (!$list) {
        abort(404);
    }
 
    return view('index', [
        'list' => $list,
        'links' => $list->links,
        'lists' => LinkList::all()
    ]);
})->name('link-list');
 

に注意してください /{slug} slugによるリンクの一覧表示を担当するrouteは、現在、並べ替え方法を使用していません。 リンクは、 list で定義された関係を使用して、コードで強調表示された変数 LinkList モデル。

ここでリストに複数のリンクを追加すると、クエリはデフォルトで古いものから新しいものの順に結果を返します。 あなたは使用することができますが sortDesc() 内でコレクションを並べ替える方法 $list->links を使用して呼び出す orderBy() メソッドはより柔軟性を提供し、後で追加のフィルタリング条件を含めることができます。 このメソッドをチェーンすることができます where() さらにきめ細かい結果を求めます。

前のコードサンプルで強調表示されている行を次の行に置き換えます。

ルート/web.php
'links' => $list->links()->orderBy('created_at', 'desc')->get(),

今回は、を呼び出して組み込みのクエリビルダーを呼び出していることに注意してください。 $list->links() メソッド。これは、で定義された関係メソッドを参照します。 LinkList クラス。 これは電話とは異なります $list->links クラスプロパティ(括弧なし)として、モデル内のマジックメソッドを呼び出して、そのリストに関連するすべてのリンクをフェッチします。

これは完全な方法です routes/web.php 終了すると、ファイルは次のようになります。

ルート/web.php
<?php

use Illuminate\Support\Facades\Route;
use App\Models\Link;
use App\Models\LinkList;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/', function () {
    $links = Link::all()->sortDesc();
    return view('index', [
        'links' => $links,
        'lists' => LinkList::all()
    ]);
});

Route::get('/{slug}', function ($slug) {
    $list = LinkList::where('slug', $slug)->first();
    if (!$list) {
        abort(404);
    }

    return view('index', [
        'list' => $list,
        'links' => $list->links()->orderBy('created_at', 'desc')->get(),
        'lists' => LinkList::all()
    ]);
})->name('link-list');

ファイルを保存して閉じます。 次に、を使用していくつかの新しいリンクを追加します link:new 職人のコマンド。 デフォルトのリストを使用できます。

  1. docker-compose exec app php artisan link:new
Output
Link URL: > https://laravel.com/docs/8.x/eloquent Link Description: > Laravel Eloquent Docs Link List (leave blank to use default): > New Link: https://laravel.com/docs/8.x/eloquent - Laravel Eloquent Docs Listed in: default Is this information correct? (yes/no) [no]: > yes Saved.

デフォルトのリンクリストページをリロードすると、新しいものから古いものへのリンクを取得する必要があります。

http://localhost:8000/default

同様に、リンクの説明のアルファベット順にリンクを並べ替える場合は、次のようにメソッド呼び出しでそのテーブルフィールドを使用するように行を変更する必要があります。

'links' => $list->links()->orderBy('description', 'asc')->get(),

このような変更後のリンクの順序は次のとおりです。

このシリーズの次のパートでは、LaravelEloquentクエリから合計結果数を取得する方法を学習します。

モバイルバージョンを終了