Filtro simples em Laravel ?

Ferramentas

? Composer v2.0.13
? Insomnia v2021.4.1
? Laravel v8.5.22
? MariaDB v10.5.10
? PHP v7.4.21

Preparando a tabela e dados

Tabela

Com uma aplicação laravel básica iniciada, vamos definir uma migrate para cria…


This content originally appeared on DEV Community and was authored by Daniel Rocha

Ferramentas

  • ? Composer v2.0.13
  • ? Insomnia v2021.4.1
  • ? Laravel v8.5.22
  • ? MariaDB v10.5.10
  • ? PHP v7.4.21

Preparando a tabela e dados

Tabela

Com uma aplicação laravel básica iniciada, vamos definir uma migrate para criar a tabela agency.

php artisan make:migration agency
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class Agency extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('agency', function (Blueprint $table) {
            $table->id();
            $table->integer('number');
            $table->integer('bank_number');
            $table->string('name');
            $table->boolean('active')->default(true);
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('agency');
    }
}

Vamos redefina e execute novamente todas as migrações

php artisan migrate:refresh

Dados.

Vamos adicionar alguns dados para está usando para os testes. (Não vou criar uma rota/método para adicionar).

-- AGENCY
INSERT INTO agency (bank_number, number, name) VALUES
  (1, 1, 'Agência número 1 do banco Banco do Brasil S.A.'),
  (1, 2, 'Agência número 2 do banco Banco do Brasil S.A.'),
  (1, 3, 'Agência número 3 do banco Banco do Brasil S.A.'),
  (1, 4, 'Agência número 4 do banco Banco do Brasil S.A.'),
  (247, 1, 'Agência número 1 do banco Banco Itaú S.A.'),
  (247, 2, 'Agência número 2 do banco Banco Itaú S.A.'),
  (247, 3, 'Agência número 3 do banco Banco Itaú S.A.'),
  (237, 10 ,'Agência número 10 do banco Banco Bradesco S.A.'),
  (237, 11, 'Agência número 11 do banco Banco Bradesco S.A.'),
  (237, 12, 'Agência número 12 do banco Banco Bradesco S.A.'),
  (237, 13, 'Agência número 13 do banco Banco Bradesco S.A.'),
  (104,1,'Agência número 1 do banco Caixa Econômica Federal'),
  (104,2,'Agência número 2 do banco Caixa Econômica Federal'),
  (104,3,'Agência número 3 do banco Caixa Econômica Federal'),
  (104,4,'Agência número 4 do banco Caixa Econômica Federal'),
  (104,5,'Agência número 5 do banco Caixa Econômica Federal'),
  (104,6,'Agência número 6 do banco Caixa Econômica Federal');

Preparando Controller e Model;

Model

php artisan make:model AgencyModel
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class AgencyModel extends Model
{
    use HasFactory;

    protected $table = 'agency';
}

Controlller

php artisan make:controller AgencyController
<?php

namespace App\Http\Controllers;

use App\Models\AgencyModel;
use Illuminate\Http\Request;

class AgencyController extends Controller
{
    public function filter(Request $request)
    {
        $agencyModel = (new AgencyModel())
            ->orderBy('bank_number');

        $where = $this->applyFilter($request->all());

        if(empty($where)) {
           return $agencyModel->get();
        }

        foreach($where as $filter) {
            $agencyModel->where(...$filter);
        }

        return $agencyModel->get();
    }

    private function applyFilter(array $params) : array
    {
        $where = [
            'name' =>  fn($data) => ['name', 'like', '%'.$data.'%'],
            'number' => fn($data) => ['number', '=', $data],
            'bank_number' => fn($data) => ['bank_number', '=', $data],
            'active' => fn($data) => ['active', '=', $data],
        ];

        $params = array_filter($params, fn($where) => !empty($where));

        $filters = [];
        foreach($params as $key => $data) {
            if(array_key_exists($key, $where)) {
                $filters[] = $where[$key]($data);
            }
        }

        return $filters;
    }
}

Na definição da rota


<?php

use App\Http\Controllers\AgencyController;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/

Route::middleware('auth:api')->get('/user', function (Request $request) {
    return $request->user();
});

Route::prefix('v1')->group(function() {
    Route::get('agency', [AgencyController::class, 'filter']);
});

'Testando'

  • Exemplo de URL
http://localhost:8000/api/v1/agency?name=Caixa%20Econmmmmica%20Federal

Alt Text

GIF Demo

Alt Text

A implementação acima não é a melhor forma de fazer, por desconhecer outra solução e ter pouca experiência não posso fazer afirmações incorretas, mas acho que é melhor que a repetição de ifs.


This content originally appeared on DEV Community and was authored by Daniel Rocha


Print Share Comment Cite Upload Translate Updates
APA

Daniel Rocha | Sciencx (2021-08-02T18:09:41+00:00) Filtro simples em Laravel ?. Retrieved from https://www.scien.cx/2021/08/02/filtro-simples-em-laravel-%f0%9f%94%8e/

MLA
" » Filtro simples em Laravel ?." Daniel Rocha | Sciencx - Monday August 2, 2021, https://www.scien.cx/2021/08/02/filtro-simples-em-laravel-%f0%9f%94%8e/
HARVARD
Daniel Rocha | Sciencx Monday August 2, 2021 » Filtro simples em Laravel ?., viewed ,<https://www.scien.cx/2021/08/02/filtro-simples-em-laravel-%f0%9f%94%8e/>
VANCOUVER
Daniel Rocha | Sciencx - » Filtro simples em Laravel ?. [Internet]. [Accessed ]. Available from: https://www.scien.cx/2021/08/02/filtro-simples-em-laravel-%f0%9f%94%8e/
CHICAGO
" » Filtro simples em Laravel ?." Daniel Rocha | Sciencx - Accessed . https://www.scien.cx/2021/08/02/filtro-simples-em-laravel-%f0%9f%94%8e/
IEEE
" » Filtro simples em Laravel ?." Daniel Rocha | Sciencx [Online]. Available: https://www.scien.cx/2021/08/02/filtro-simples-em-laravel-%f0%9f%94%8e/. [Accessed: ]
rf:citation
» Filtro simples em Laravel ? | Daniel Rocha | Sciencx | https://www.scien.cx/2021/08/02/filtro-simples-em-laravel-%f0%9f%94%8e/ |

Please log in to upload a file.




There are no updates yet.
Click the Upload button above to add an update.

You must be logged in to translate posts. Please log in or register.