Tengo un controlador que obtiene las cuatro entradas de un formulario de búsqueda.
Código SearchController.php
public function results(Request $request) { $text = $request -> text; $pet = $request -> pet; $category = $request -> category; $city = $request -> city; $searchArray = []; if(empty($text) && empty($pet) && empty($category) && empty($city)) { Session::flash('danger', "You didn't select any search any search."); return redirect() -> back(); } //SEARCH CODE HERE }lo que estoy tratando de hacer
Estoy tratando de buscar 4 columnas en mi base de datos.
El problema es
También necesito buscar las 4 columnas en una consulta.
Eso significa que necesito verificar si la variable $text no está vacía y si la variable $pet no está vacía, entonces tengo que hacer esta consulta:
if(!empty($text) && !empty($pet)) $result = Post::where('text', 'like', '%'.$text.'%') -> where('text', $pet) -> get();Este método funcionará bien, pero tendré varias declaraciones if que verificarán todas las posibilidades.
¿Existe una solución más rápida y óptima?
Opción 1
Cree la lógica manualmente. Esta es la mejor manera en muchas situaciones. Un ejemplo:
$result = Post::query(); if (!empty($text)) { $result = $result->where('text', 'like', '%'.$text.'%'); } if (!empty($pet)) { $result = $result->where('pet', $pet); } if (!empty($category)) { $result = $result->where('category', $category); } if (!empty($city)) { $result = $result->where('city', 'like', '%'.$city.'%'); } $result = $result->get();opcion 2
Utiliza cláusulas condicionales . Ejemplo:
Post::when($text, function ($q) use ($text) { return $q->where('text', 'like', '%'.$text.'%'); }) ->when($pet, function ($q) use ($pet) { return $q->where('pet', $pet); }) ->when($category, function ($q) use ($category) { return $q->where('category', $category); }) ->when($city, function ($q) use ($city) { return $q->where('city', 'like', '%'.$city.'%'); }) ->get();