php - updateorcreate - Eloquente-múltiples DONDE ME GUSTA condiciones
updateorcreate laravel (3)
¿No es solo para generar la matriz? ¿O estoy malentendiendo la pregunta?
<?php
$keys = [''samsung'', ''lg'', ''sony'', ''nokia'', ''apple''];
$keywords = [];
foreach($keys as $key){
$keywords[] = [''keywords'', ''LIKE'', ''%''.$key.''%''];
}
$products = Product::where($keywords)->paginate(15);
Actualmente estoy intentando implementar una búsqueda en mi db para palabras clave. Por lo tanto, dividí una cadena separada por una coma, así que obtuve una matriz que contenía una cantidad variable de elementos (una palabra clave).
Sé que puedo usar una construcción elocuente como esa:
$products = Product::where([[''keywords'', ''LIKE'', %samsung%], [keywords, ''LIKE'', ''s7'']])->paginate(15);
para encontrar un producto con las palabras clave samsung,galaxy,s7
.
Ahora necesito esto, pero generado automáticamente para un número variable de partes de búsqueda, así que para cada palabra clave en el arreglo necesito agregar una [''keywords'', ''LIKE'', ''...''] ...
¿Cómo puedo hacer esto con Laravels Eloquent?
Puedes hacerlo:
$query = "Samsung galaxy S7"; // Or whatever the query is
$words = preg_split("/[ ,.]/",$query); //Split on space comma or dot. Maybe need more?
$queries = array_map(function ($word) {
return [ "keywords", "LIKE", "%$word%" ];
}, $words); //Transform single words to array of queries
$products = Product::where($queries)->paginate(15);
Compruebe cómo funciona la primera parte del código en: https://eval.in/730772
Utilice el cierre. Primero, asegúrese de guardar la lista de palabras clave en una matriz o similar. Entonces ...
$keywords = [''samsung'', ''s7'', ''what else''];
$products = Product::where(function ($query) use ($keywords) {
foreach ($keywords as $keyword) {
$query->orWhere(''keyword'', ''like'', $keyword);
}
})->paginate(15);
otro ejemplo
$keywords = [
[''name'', ''LIKE'', $searchQuery],
[''category_id'', ''='', $selectedSubcategory],
];
$products = Product::where(function ($query) use ($keywords) {
foreach ($keywords as $keyword) {
$query->where($keyword);
}
})->paginate(15);
otro que no sea
$keywords = [
[''name'', ''LIKE'', $searchQuery],
[''category_id'', ''='', $selectedSubcategory],
[''please_id'', ''='', $learnPhpArray],
];
$products = Product::query();
foreach ($keywords as $keyword) {
$products = $products->where($keyword);
}
return $products->paginate(15);
¿Qué hace el orWhere? ¿Conecta las partes de la consulta con un AND?
No, con OR
. Como inverso (?) where
sí lo hace AND
por defecto.
Referencias