DEV Community

Daniel Rocha
Daniel Rocha

Posted on

3 2

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 criar a tabela agency.

php artisan make:migration agency
Enter fullscreen mode Exit fullscreen mode
<?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');
    }
}
Enter fullscreen mode Exit fullscreen mode

Agora redefina e execute novamente todas as migraçÔes

php artisan migrate:refresh
Enter fullscreen mode Exit fullscreen mode

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');
Enter fullscreen mode Exit fullscreen mode

Preparando Controller e Model;

Model

php artisan make:model AgencyModel
Enter fullscreen mode Exit fullscreen mode
<?php

namespace App\Models;

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

class AgencyModel extends Model
{
    use HasFactory;

    protected $table = 'agency';
}

Enter fullscreen mode Exit fullscreen mode

Controlller

php artisan make:controller AgencyController
Enter fullscreen mode Exit fullscreen mode
<?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;
    }
}
Enter fullscreen mode Exit fullscreen mode

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']);
});

Enter fullscreen mode Exit fullscreen mode

'Testando'

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

Exemplo com Insomnia

GIF Demo

GIF demo

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.

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

Top comments (0)

The Most Contextual AI Development Assistant

Pieces.app image

Our centralized storage agent works on-device, unifying various developer tools to proactively capture and enrich useful materials, streamline collaboration, and solve complex problems through a contextual understanding of your unique workflow.

đŸ‘„ Ideal for solo developers, teams, and cross-company projects

Learn more

👋 Kindness is contagious

Please leave a ❀ or a friendly comment on this post if you found it helpful!

Okay