Vamos a crear los filtros que implementamos antes mediante condicionales, con "modo Laravel" que es el recomendado por el equipo de Laravel y ya queda de parte del lector cuál prefiere emplear.
Para esto, emplearemos el when() en el cual, el primer parámetro corresponde a la propiedad a evaluar, que en caso de que el valor este definido, ejecuta el segundo parámetro que corresponde al clausure:
Model::when(request('search'), function (Builder $query, string $search) ...
El closure que corresponde al segundo parámetro recibe por parámetros el $query para aplicar cualquier tipo de operación con Eloquent y el parámetro evaluado:
Model::when(request('search'), function (Builder $query, string $search) {
$query->where(function ($query) use ($search) {
$query-><WHERES>
})
Recuerda que te había comentado al inicio de esta sección que me parece muy interesante también mostrarte la solución con el web aquí la comencé a hacer ya ahorita te explico un poco y entramos en contexto aquí lo que te pediría si quieres hacer esta práctica es que dupliquen el que teníamos antes puedes ver que te de la solución anterior ojo que es mi favorita yo prefiero emplear aquí los condicionales:
// public function render()
// {
// // $posts = Post::paginate(15);
// // $posts = Post::where('id', '>=', 1);
// $posts = new Post();
// // $categories = Category::get();
// $categories = Category::pluck("title", "id");
// //filters
// if ($this->type) {
// $posts = $posts->where('type', $this->type);
// }
// if ($this->category_id) {
// $posts = $posts->where('category_id', $this->category_id);
// }
// if ($this->posted) {
// $posts = $posts->where('posted', $this->posted);
// }
// if ($this->search) {
// $posts = $posts->where(function($query){
// $query
// ->orWhere('id', 'like', '%'.$this->search.'%')
// ->orWhere('title', 'like', '%'.$this->search.'%')
// ->orWhere('description', 'like', '%'.$this->search.'%')
// ;
// });
// }
// if ($this->from && $this->to) {
// $posts = $posts->whereBetween('date', [date($this->from), date($this->to)]);
// }
// //filters
// $posts = $posts->paginate(15);
// return view('livewire.dashboard.post.index', compact('posts', 'categories'));
// }
Ya que con este se me hace Bueno un poquito aquí comencé y vamos a terminar la implementación para hacerlo de práctica Recuerda que el uso de los web aquí lo puedes ver en la documentación oficial del Laravel viene siendo la forma en la cual tenemos Laravel oficial para agregar condicionales tal cual puedes ver aquí cláusulas conditional.
Entonces su funcionamiento es muy sencillo el tema aquí es la configuración ya que agarré Sencillamente la más complicada, tenemos muchas formas pero todo comienza colocando post obviamente ya no hace falta colocar aquí el la distancia como quien dice la consulta base o o de plana que tenemos aquí para armar el post ni con el New post ni con este sino directamente vamos desde distancia desde el modelo entonces colocamos when:
$posts = Post::when($this->search, function (Builder $query, string $search) {
$query->where(function ($query) use ($search) {
$query->orWhere('id', 'like', "%" . $search . "%")
->orWhere('title', 'like', "%" . $search . "%")
->orWhere('description', 'like', "%" . $search . "%");
});
})
A partir de aquí básicamente sería el filtro en base a la sintaxis aquí le tienes que pasar lo que es el parámetro y él va a aplicar los filtros solamente si existe a partir de aquí este parámetro es que se suministra a lo que sería clausure y aquí le puedes colocar cualquier nombre aquí le colocan search y
Para el resto de los parámetros, también definimos las clasusulas when:
$posts = Post::when($this->search, function (Builder $query, string $search) {
$query->where(function ($query) use ($search) {
$query->orWhere('id', 'like', "%" . $search . "%")
->orWhere('title', 'like', "%" . $search . "%")
->orWhere('description', 'like', "%" . $search . "%");
});
})
->when($this->type, function(Builder $query, $type) {
$query->where('type', $type);
})
->when($this->category_id, function(Builder $query, $category_id) {
$query->where('category_id', $category_id);
})
->when($this->posted, function(Builder $query, $posted) {
$query->where('posted', $posted);
})
->when($this->type, function(Builder $query, $type) {
$query->where('type', $type);
})
->when($this->to, function(Builder $query, $to) use($from) {
$query->whereBetween('date', [date($from), date($this->to)]);
})->with('category')
->orderBy($this->sortColumn, $this->sortDirection)
->paginate(15);
Y sus filtros respectivos:
<div class="grid grid-cols-2 gap-2 mb-3">
<select class="block w-full" wire:model.live='posted'>
<option value="">{{ __('Posted') }}</option>
<option value="not">{{ __('Not') }}</option>
<option value="yes">{{ __('Yes') }}</option>
</select>
<select class="block w-full" wire:model.live='type'>
<option value="">{{ __('Type') }}</option>
<option value="advert">{{ __('Advert') }}</option>
<option value="post">{{ __('Post') }}</option>
<option value="course">{{ __('Course') }}</option>
<option value="movie">{{ __('Movie') }}</option>
</select>
<select class="block w-full" wire:model.live='category_id'>
<option value="">{{ __('Category') }}</option>
@foreach ($categories as $i => $c)
<option value="{{ $i }}">{{ $c }}</option>
@endforeach
</select>
<x-input wire:model.live='search' placeholder="{{ __('Search...') }}" />
<div class="grid grid-cols-2 gap-2">
<x-input wire:model='from' placeholder="From" type='date' />
<x-input wire:model.live='to' placeholder="To" type='date' />
</div>
</div>
En definitiva, el uso del método when no es mas que una consulta que se ejecutar de manera opcional si se cumple una condición de verdadero o falso.
https://github.com/libredesarrollo/book-course-laravel-livewire/blob/main/resources/views/livewire/dashboard/post/index.blade.php
- Andrés Cruz
Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter
Acepto recibir anuncios de interes sobre este Blog.
!Cursos desde!
4$
En Academia
Ver los cursos!Libros desde!
1$
Ver los libros