web-dev-qa-db-ja.com

Laravel 5.6 Api-データのリストで検索、並べ替え、フィルタリング

こんにちは私はユーザーのページ付けされたリストを取得するためのRESTAPIエンドポイントを開発しています。フロントエンドには、リストされているすべての列で検索し、すべての列で並べ替え、名前、ステータス、作成日でフィルタリングするオプションがあります。

これまで、検索、並べ替え、フィルタリングのために、ユーザーモデルにリポジトリとローカルスコープを作成しました。これはこれまでの私のコードです。フィルタオプションと混同しています。ユーザーは、3つのオプションすべてを備えた通話フィルターです。最も最適化された方法でAPIでこれらの値を渡す方法は?

コントローラー:

public function index(Request $request)
{
    $this->userRepository->getAllUsers($request);
}

リポジトリ関数:

public function getAllUsers($request)
{
    // Search Parameter
    isset($request->q)? $q = $request->q: $q = null;

    // Sort Parameter
    if ( isset($request->sortby) && (isset($request->direction)) ) {
        $sort[$request->sortby] = $request-> direction;
    }

    return User::where('type','=','student')
                ->ofSearch($q)
                ->ofSort($sort)
                ->paginate($per_page)
}

モデル:

public function scopeOfSearch($query, $q)
{
    if ( $q ) {
        $query->orWhere('name', 'LIKE', '%' . $q . '%')
              ->orWhere('school', 'LIKE', '%' . $q . '%')
              ->orWhere('email', 'LIKE', '%' . $q . '%')
              ->orWhere('phone', 'LIKE', '%' . $q . '%')
              ->orWhere('class', 'LIKE', '%' . $q . '%');
    }

    return $query;
}

public function scopeOfSort($query, $sort = [])
{
    if ( ! empty($sort) ) {
        foreach ( $sort as $column => $direction ) {
            $query->orderBy($column, $direction);
        }
    } 
    else {
        $query->orderBy('users.name'); 
    }

    return $query;
}
3
Zammuuz

とにかく、すべてのフィルターをその値とともに送信する別の投稿エンドポイントを作成することを修正しました。これが正しい方法かどうかはわかりませんが、今ではこのようにしか考えられません。

更新

こんにちはみんな、私は以下のチュートリアルに従ってフィルターを実装しました。

https://m.dotdev.co/writing-advanced-eloquent-search-query-filters-de8b6c2598db

1
Zammuuz

リポジトリのコードを次のように変更します。

public function getAllUsers($request)
{
    // Set query builder
    $qb = User::query();
    if($request->has('q')){
        $qb->ofSearch($q);
    }
    if($request->has('sortby')){
        //Handle default parameter of get with second argument
        $qb->orderBy($request->get('sortBy'), $request->get('direction', 'ASC'));
    }

    return $qb->paginate();
}

Request :: getメソッドハンドルissetチェック!

0
lucas

Laravel API(Laravel 5.xおよび6.1でテスト済み)を使用してDBデータを並べ替えてフィルタリングする必要がある人のための簡単なソリューション。

まず、DBにテーブルを作成します。テスト提案のために手動で行うこともできますが、次のことをお勧めします: https://laravel.com/docs/5.7/migrations

その例では、テーブルの名前は「my_task」です。

次に、ルートLaravelディレクトリに入力するモデルを作成します:

php artisan make:model MyTask(戻り値:モデルは正常に作成されました。)

モデルはアプリディレクトリ内に作成されます。

次に、ルートLaravelディレクトリ:

php artisan make:controller MyTaskController(戻り値:コントローラーは正常に作成されました。)

コントローラーはapp/Http/Controllers/内に作成されます。その後、コントローラーMyTaskController.phpファイル内に以下のコードを挿入します。

<?php

namespace App\Http\Controllers;

use App\MyTask;
use DB;
use Illuminate\Http\Request;

class MyTaskController extends Controller
{
       public function filter($parameter)
                {
                        $filter = DB::table('my_task')
                                ->where('field123', '=', $parameter)
                                ->get();
                        return $filter;
                }
}

最後に、コントローラーを指すルートをroutes/api.phpファイルに追加します。

Route::get("my-task/{parameter}", "MyTaskController@filter");

ブラウザまたはPostmanを使用してエンドポイントをテストします。

http://127.0.0.1/api/my-task/value

上記のURLの「value」は、データベースのmy-taskテーブルで検索する値です。

追伸:同じコントローラー内の他の関数にポッティングする新しいルートを作成して、「ソート」のように他のタイプの操作を行うことができます。

0
Fellipe Sanches