Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 29.04.2015 16:38:27

Arat
Откуда: Киев
Сообщений: 116

Поиск по базе из нескольких полей формы

Всем привет!
Подскажите, пожалуйста, как можно грамотно реализовать поиск по нескольким полям формы.
Диспозиция: есть сайт по поиску недвижимости.
Форма поиска: местоположение, кол-во комнат (от-до), площадь (от-до), стоимость (от-до), etc.
Т.е. заполнение всех полей не обязательно.
Как можно рганизовать такую систему? В построении сложных запросов не спец совсем еще :( А проверять кучу вариантов полей, что заполнено, что нет и перебирать от этого разные запросы — тупо.
Какие идеи могут быть? Спасибо, ребята!!

Не в сети

#2 06.05.2015 12:40:35

Arat
Откуда: Киев
Сообщений: 116

Re: Поиск по базе из нескольких полей формы

Народ, хелп! ))))

Не в сети

#3 08.05.2015 11:26:06

Re: Поиск по базе из нескольких полей формы

>> А проверять кучу вариантов полей, что заполнено, что нет и перебирать от этого разные запросы — тупо.
А почему тупо?
Тебе все равно нужно будет их все обходить для выявления - кто чего имеет.
Сформулируй вопрос конкретнее - сколько таблиц (с названием), какие поля(с названием) и что уже пробовал.
Приведи пример таблиц.

Не в сети

#4 08.05.2015 11:52:33

Alex1234

Re: Поиск по базе из нескольких полей формы

Действительно почему.
Например есть форма на 10 полей, все не обязательные т.е. пользователь может заполнить как 1 так и 10 полей.
А у себя смотришь поле 1 заполнено, валидацию прошло - при составлении запроса добавляешь AND поле1=значение формы1 и так далее.
В итоге получится запрос на поиск по полям которые заполнил пользователь.

#5 08.05.2015 12:18:37

Re: Поиск по базе из нескольких полей формы

Alex1234 пишет:

Действительно почему.
Например есть форма на 10 полей, все не обязательные т.е. пользователь может заполнить как 1 так и 10 полей.
А у себя смотришь поле 1 заполнено, валидацию прошло - при составлении запроса добавляешь AND поле1=значение формы1 и так далее.
В итоге получится запрос на поиск по полям которые заполнил пользователь.

Ты прав )), я не понял вопроса)

Не в сети

#6 08.05.2015 12:30:31

Arat
Откуда: Киев
Сообщений: 116

Re: Поиск по базе из нескольких полей формы

Alex1234 пишет:

Действительно почему.
Например есть форма на 10 полей, все не обязательные т.е. пользователь может заполнить как 1 так и 10 полей.
А у себя смотришь поле 1 заполнено, валидацию прошло - при составлении запроса добавляешь AND поле1=значение формы1 и так далее.
В итоге получится запрос на поиск по полям которые заполнил пользователь.

Ну как видится мне:
Валидацию формы провести, потом проверить на наличие в в полях данных. И в зависимости от результата перебирать возможные запросы.
Думал, может есть универсальный метод.

Изменено Arat (08.05.2015 12:31:57)

Не в сети

#7 08.05.2015 15:10:00

Alex1234

Re: Поиск по базе из нескольких полей формы

Ну,  может способ и есть но проверять что ввели все равно нужно.
Просто в процессе проверки, ты дополняешь исходный запрос условиями.
а <<перебирать возможные запросы>> не нужно.

#8 09.05.2015 13:51:42

Arat
Откуда: Киев
Сообщений: 116

Re: Поиск по базе из нескольких полей формы

Вся неприятность в том, что есть поля цены "от" и "до", количество комнат "от" и "до".
Т.е. в запросе нужно искать помимо того значения между этими "от" и "до"...

Не в сети

#9 16.09.2015 14:26:25

Arat
Откуда: Киев
Сообщений: 116

Re: Поиск по базе из нескольких полей формы

Всем снова привет! Возвращаюсь к своему вопросу.
Есть проблема с использованием DB::raw() для поиска по базе.

из формы получаю массив данных. Его валидирую и дальше отдаю на обработку:

PHP
public function search() {
        
$data Input::all();

        
$validator Validator::make($dataSearch::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
Как правильно из базы по такому запросу вытащить данные? Спасибо!

Не в сети

#10 16.09.2015 22:29:07

Artdevue
Откуда: Kiev
Сообщений: 119
Сайт

Re: Поиск по базе из нескольких полей формы

А для чего вам 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.

Не в сети

#11 17.09.2015 14:14:53

Arat
Откуда: Киев
Сообщений: 116

Re: Поиск по базе из нескольких полей формы

Artdevue пишет:

А для чего вам DB::raw()? Какие то сложные выборки?
Как вариант попробуйте, не проверял.

метод query() в Eloquent разве есть?..

Изменено Arat (17.09.2015 14:15:03)

Не в сети

#12 17.09.2015 14:20:32

Artdevue
Откуда: Kiev
Сообщений: 119
Сайт

Re: Поиск по базе из нескольких полей формы

а у вас не работает? smile


If you think it’s expensive to hire a professional to do the job, wait until you hire an amateur.

Не в сети

#13 17.09.2015 14:36:12

Arat
Откуда: Киев
Сообщений: 116

Re: Поиск по базе из нескольких полей формы

Artdevue пишет:

а у вас не работает? smile

Ну, во-первых, $results в конце нужно переинициировать, во-вторых, неа, не пашет sad

Изменено Arat (17.09.2015 14:36:29)

Не в сети

#14 18.09.2015 06:47:25

Artdevue
Откуда: Kiev
Сообщений: 119
Сайт

Re: Поиск по базе из нескольких полей формы

Arat пишет:

Ну, во-первых, $results в конце нужно переинициировать, во-вторых, неа, не пашет sad

Упустил
Странно, но у меня работало и работает, для примера кусок

<?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.

Не в сети

#15 18.09.2015 19:37:05

Arat
Откуда: Киев
Сообщений: 116

Re: Поиск по базе из нескольких полей формы

Artdevue пишет:
Arat пишет:

Ну, во-первых, $results в конце нужно переинициировать, во-вторых, неа, не пашет sad

Упустил
Странно, но у меня работало и работает, для примера кусок

<?php
...
        $orders = $q->get();
        // ..........

Ну, конечно, блин! get() забыли... )))))))

Не в сети

#16 21.09.2015 13:43:34

Arat
Откуда: Киев
Сообщений: 116

Re: Поиск по базе из нескольких полей формы

Блин, и даже с $q->get(); не пашет sad

Не в сети

#17 21.09.2015 15:25:39

Arat
Откуда: Киев
Сообщений: 116

Re: Поиск по базе из нескольких полей формы

Пошло вот таким макаром (кому интересно)

PHP
public function search() {
        
$data Input::all();

        
$validator Validator::make($dataSearch::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();

Огромное спасибо за помощь!!

Не в сети

Подвал раздела