From 5f61d15a89d6c57b891cba8f9c40730bfbf03403 Mon Sep 17 00:00:00 2001 From: Thomas Rubini <74205383+ThomasRubini@users.noreply.github.com> Date: Fri, 20 Jan 2023 18:30:08 +0100 Subject: [PATCH] add search functionality to RecipeModel --- Controllers/RecipeController.php | 5 ++++- Models/RecipeModel.php | 35 ++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/Controllers/RecipeController.php b/Controllers/RecipeController.php index 02635d7..a453f75 100644 --- a/Controllers/RecipeController.php +++ b/Controllers/RecipeController.php @@ -71,7 +71,10 @@ final class RecipeController private function searchQueryView(Array $A_urlParams = null, Array $A_postParams = null, Array $A_getParams = null) { - $A_results = array(); + + $O_recipeModel = new RecipeModel(); + $A_results = $O_recipeModel->searchRecipesByName($A_getParams["query"]); + View::show("recipe/search", array( "QUERY" => $A_getParams["query"], "RESULTS" => $A_results, diff --git a/Models/RecipeModel.php b/Models/RecipeModel.php index a6bd09d..978fa70 100644 --- a/Models/RecipeModel.php +++ b/Models/RecipeModel.php @@ -33,4 +33,39 @@ final class RecipeModel return $A_recipe; } + + public function searchRecipesByName($S_query) + { + + $O_model = Model::get(); + $stmt = $O_model->prepare(" + -- split search term at space + with recursive CTE as ( + select + CAST(null as char(255)) as NAME, + CONCAT(:query, ' ') as NAMES + + union all + select substring_index(NAMES, ' ', 1), + substr(NAMES, instr(NAMES, ' ')+1) + from CTE + where NAMES != '' + ) + + -- get a row per occurrence and sort by occurrences number + select RECIPE.ID, RECIPE.NAME + from CTE + JOIN RECIPE + WHERE CTE.NAME is not null + AND INSTR(RECIPE.NAME, CTE.NAME) > 0 + GROUP BY RECIPE.ID + ORDER BY count(RECIPE.ID) DESC + LIMIT 10; + "); + + $stmt->bindParam("query", $S_query); + $stmt->execute(); + + return $stmt->fetchAll(); + } }