Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Всем привет!
Подскажите, пожалуйста, как можно грамотно реализовать поиск по нескольким полям формы.
Диспозиция: есть сайт по поиску недвижимости.
Форма поиска: местоположение, кол-во комнат (от-до), площадь (от-до), стоимость (от-до), etc.
Т.е. заполнение всех полей не обязательно.
Как можно рганизовать такую систему? В построении сложных запросов не спец совсем еще А проверять кучу вариантов полей, что заполнено, что нет и перебирать от этого разные запросы — тупо.
Какие идеи могут быть? Спасибо, ребята!!
Не в сети
Не в сети
>> А проверять кучу вариантов полей, что заполнено, что нет и перебирать от этого разные запросы — тупо.
А почему тупо?
Тебе все равно нужно будет их все обходить для выявления - кто чего имеет.
Сформулируй вопрос конкретнее - сколько таблиц (с названием), какие поля(с названием) и что уже пробовал.
Приведи пример таблиц.
Не в сети
Действительно почему.
Например есть форма на 10 полей, все не обязательные т.е. пользователь может заполнить как 1 так и 10 полей.
А у себя смотришь поле 1 заполнено, валидацию прошло - при составлении запроса добавляешь AND поле1=значение формы1 и так далее.
В итоге получится запрос на поиск по полям которые заполнил пользователь.
Действительно почему.
Например есть форма на 10 полей, все не обязательные т.е. пользователь может заполнить как 1 так и 10 полей.
А у себя смотришь поле 1 заполнено, валидацию прошло - при составлении запроса добавляешь AND поле1=значение формы1 и так далее.
В итоге получится запрос на поиск по полям которые заполнил пользователь.
Ты прав )), я не понял вопроса)
Не в сети
Действительно почему.
Например есть форма на 10 полей, все не обязательные т.е. пользователь может заполнить как 1 так и 10 полей.
А у себя смотришь поле 1 заполнено, валидацию прошло - при составлении запроса добавляешь AND поле1=значение формы1 и так далее.
В итоге получится запрос на поиск по полям которые заполнил пользователь.
Ну как видится мне:
Валидацию формы провести, потом проверить на наличие в в полях данных. И в зависимости от результата перебирать возможные запросы.
Думал, может есть универсальный метод.
Изменено Arat (08.05.2015 12:31:57)
Не в сети
Ну, может способ и есть но проверять что ввели все равно нужно.
Просто в процессе проверки, ты дополняешь исходный запрос условиями.
а <<перебирать возможные запросы>> не нужно.
Вся неприятность в том, что есть поля цены "от" и "до", количество комнат "от" и "до".
Т.е. в запросе нужно искать помимо того значения между этими "от" и "до"...
Не в сети
Всем снова привет! Возвращаюсь к своему вопросу.
Есть проблема с использованием DB::raw() для поиска по базе.
из формы получаю массив данных. Его валидирую и дальше отдаю на обработку:
public function search() {
$data = Input::all();
$validator = Validator::make($data, Search::rules(), Search::errors());
if ($validator->fails()) {
return Redirect::back()->withErrors($validator)->withInput();
} else {
$query = "SELECT * FROM objects WHERE 'active' = '1'";
if($data['id'] !== "" && $data['id'] !== "0") {
$query .= " AND WHERE id = '".$data['id']."'";
} else {
if ($data['location_id'] !== "" && $data['location_id'] !== "0") {
$query .= " AND WHERE location_id = '".$data['location_id']."'";
}
if ($data['case_type'] !== "" && $data['case_type'] !== "0") {
$query .= " AND WHERE case_type = '".$data['case_type']."'";
}
if ($data['type_id'] !== "" && $data['type_id'] !== "0") {
$query .= " AND WHERE type_id = '".$data['type_id']."'";
}
if ($data['min_price'] !== "" && $data['min_price'] !== "0") {
$query .= " AND WHERE price >= '".$data['min_price']."'";
}
if ($data['max_price'] !== "" && $data['max_price'] !== "0") {
$query .= " AND WHERE price <= '".$data['max_price']."'";
}
if ($data['currency'] !== "" && $data['currency'] !== "0") {
$query .= " AND WHERE currency = '".$data['currency']."'";
}
if ($data['min_area'] !== "" && $data['min_area'] !== "0") {
$query .= " AND WHERE area >= '".$data['min_area']."'";
}
if ($data['max_area'] !== "" && $data['max_area'] !== "0") {
$query .= " AND WHERE area <= '".$data['max_area']."'";
}
if ($data['area'] !== "" && $data['area'] !== "0") {
$query .= " AND WHERE area_type = '".$data['area']."'";
}
if ($data['min_rooms'] !== "" && $data['min_rooms'] !== "0") {
$query .= " AND WHERE rooms >= '".$data['min_rooms']."'";
}
if ($data['max_rooms'] !== "" && $data['max_rooms'] !== "0") {
$query .= " AND WHERE rooms <= '".$data['max_rooms']."'";
}
}
$results = DB::raw($query)->get();
}
return View::make('pages.search', ['results' => $results]);
}
В итоге ничерта не пашет и дает ошибку SQLSTATE[42000]: Syntax error or access violation
Как правильно из базы по такому запросу вытащить данные? Спасибо!
Не в сети
А для чего вам DB::raw()? Какие то сложные выборки?
Как вариант попробуйте, не проверял.
public function search()
{
$data = Input::all();
$validator = Validator::make($data, Search::rules(), Search::errors());
if ($validator->fails())
{
return Redirect::back()->withErrors($validator)->withInput();
}
else
{
$q = Objects::query();
$q->whereActive(1);
if (!empty($data['id']))
{
$q->whereId($data['id']);
}
else
{
$dat_exactly = ['location_id', 'case_type', 'type_id', 'currency', 'area'];
$dat_min_max = ['price', 'area', 'rooms'];
foreach ($dat_exactly as $value)
{
if (!empty($data[$value]))
{
$q->where($value, $data[$value]);
}
}
foreach ($dat_min_max as $value)
{
if (!empty($data['min_' . $value]))
{
$q->where($value, '>=', $data['min_' . $value]);
}
if (!empty($data['max_' . $value]))
{
$q->where($value, '<=', $data['max_' . $value]);
}
}
}
}
return View::make('pages.search', ['results' => $results]);
}
Изменено Artdevue (16.09.2015 22:31:33)
If you think it’s expensive to hire a professional to do the job, wait until you hire an amateur.
Не в сети
А для чего вам DB::raw()? Какие то сложные выборки?
Как вариант попробуйте, не проверял.
метод query() в Eloquent разве есть?..
Изменено Arat (17.09.2015 14:15:03)
Не в сети
а у вас не работает?
If you think it’s expensive to hire a professional to do the job, wait until you hire an amateur.
Не в сети
а у вас не работает?
Ну, во-первых, $results в конце нужно переинициировать, во-вторых, неа, не пашет
Изменено Arat (17.09.2015 14:36:29)
Не в сети
Ну, во-первых, $results в конце нужно переинициировать, во-вторых, неа, не пашет
Упустил
Странно, но у меня работало и работает, для примера кусок
<?php
class Orders extends Eloquent
{
public $timestamps = false;
// ...........
public static function all($status = null)
{
$input = Input::all();
$queries = Input::get('queries', []);
$sorts = Input::get('sorts', []);
$key = null;
if (!empty($sorts))
{
$key = key($sorts);
}
$sort = !empty($key) ? $key : 'date_created';
$order = !empty($sorts) && $sorts[$key] == '-1' ? 'asc' : 'desc';
$page = !empty($input['page']) ? (int) $input['page'] : 1;
$rows = !empty($input['perPage']) ? (int) $input['perPage'] : 10;
$offset = !empty($input['offset']) ? (int) $input['offset'] : 0;
$records = array();
$q = self::query();
$q->where('id_user', Auth::user()->id);
if (!empty($queries['statusf']) && $queries['statusf'] > 0 && $queries['statusf'] < 5)
{
$q->where('status', $queries['statusf']);
}
$count = $q->count();
$q->orderBy($sort, $order);
$q->skip(($page - 1) * $rows);
$q->take($rows);
$orders = $q->get();
// ..........
If you think it’s expensive to hire a professional to do the job, wait until you hire an amateur.
Не в сети
Arat пишет:Ну, во-первых, $results в конце нужно переинициировать, во-вторых, неа, не пашет
Упустил
Странно, но у меня работало и работает, для примера кусок<?php ... $orders = $q->get(); // ..........
Ну, конечно, блин! get() забыли... )))))))
Не в сети
Блин, и даже с $q->get(); не пашет
Не в сети
Пошло вот таким макаром (кому интересно)
public function search() {
$data = Input::all();
$validator = Validator::make($data, Search::rules(), Search::errors());
if ($validator->fails())
{
return Redirect::back()->withErrors($validator)->withInput();
}
else
{
$q = DB::table('objects');
$q->where('active', 1);
if (!empty($data['id']))
{
$q->where('id', $data['id']);
}
else
{
$dat_exactly = ['location_id', 'case_type', 'type_id', 'currency', 'area'];
$dat_min_max = ['price', 'area', 'rooms'];
foreach ($dat_exactly as $value)
{
if (!empty($data[$value]))
{
$q->where($value, $data[$value]);
}
}
foreach ($dat_min_max as $value2)
{
if (!empty($data['min_' . $value2]))
{
$q->where($value2, '>=', $data['min_' . $value2]);
}
if (!empty($data['max_' . $value2]))
{
$q->where($value2, '<=', $data['max_' . $value2]);
}
}
}
}
$objects = $q->get();
Не в сети
Страницы 1