Laravel по-русски

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

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

#1 17.09.2014 10:24:31

Как организовать поиск по нескольким данным в Laravel 4.2?

Добрый день!

Подскажите, как сделать поиск по нескольким данным?

Имеется форма:

{{ Form::open(array( 'url' => '/search')) }}

<select name="district" class="form-control">
	<option value="0">Выберите район</option>
	@foreach($districts as $district)
	<option value="{{ $district->id }}">{{ $district->name }}</option>
	@endforeach
</select>

<select name="zavtype" class="form-control">
	<option value="0">Выберите тип</option>
	@foreach($zavtypes as $zavtype)
	<option value="{{ $zavtype->id }}">{{ $zavtype->name }}</option>
	@endforeach
</select>

<select name="kuhtype" class="form-control">
	<option value="0">Выберите вид</option>
	@foreach($kuhtypes as $kuhtype)
	<option value="{{ $kuhtype->id }}">{{ $kuhtype->name }}</option>
	@endforeach
</select>

{{ Form::text('price_min', null, [ 'placeholder' => 'Цена от', 'autocomplete' => 'off', 'class' => 'form-control' ]) }}

{{ Form::text('price_max', null, [ 'placeholder' => 'Цена от', 'autocomplete' => 'off', 'class' => 'form-control' ]) }}

{{ Form::submit('Поиск', [ 'class' => 'btn btn-default' ]) }}

{{ Form::close() }}

Поиск производиться по таблице posts. У каждого поста есть district_id, zavtype_id и kuhtype_id
Также в таблице имеется price, и по нему идет поиск price_min и price_max.

// SearchController

<?php

	class SearchController extends BaseController{

		public function search(){

			$data = Input::all();

			$results = Search::get($data);

			return View::make('search', array(
				
				'results' => $results,
				'districts' => $districts,
				'zavtypes' => $zavtypes,
				'kuhtypes' => $kuhtypes

				));

}
}
?>



// Search.php - model

$result = Post::where('district_id', '=', $data['district']);

Подскажите, как сделать поиск по нескольким данным (district_id, zavtype_id, kuhtype и по ценам) ?
Если я не правильно выстроил логику, то буду рад замечаниям, т.к. в Laravel начинающий.

Не в сети

#2 17.09.2014 17:58:04

Re: Как организовать поиск по нескольким данным в Laravel 4.2?

А где сам запрос? Что смотреть-поправлять-подсказывать?
По нескольким данным нужно делать запрос с несколькими where(). Ман в помощь для начала...

Не в сети

#3 17.09.2014 19:43:36

Re: Как организовать поиск по нескольким данным в Laravel 4.2?

А в чём проблема?

YourModel::where('price', '>', 123)->where('price', '<', 456)->where('district_id', '=', 9)->...->get()

SMGladkovskiy дал ссылку на доки, читайте. На русском есть тут.

Не в сети

#4 17.09.2014 21:34:00

Re: Как организовать поиск по нескольким данным в Laravel 4.2?

Proger_XP пишет:

}%А в чём проблема?
%%
YourModel::where('price', '>', 123)->where('price', '<', 456)->where('district_id', '=', 9)->...->get()
%%
**SMGladkovskiy** дал ссылку на доки, читайте. На русском есть ((http://laravel.ru/docs/v4/eloquent тут)).


Спасибо! Только вот, если не указывать, к примеру, максимальную сумму, то выдает ошибку.

Не в сети

#5 18.09.2014 15:20:15

Re: Как организовать поиск по нескольким данным в Laravel 4.2?

И опять, ман Вам в помощь.

Не в сети

#6 18.09.2014 21:21:25

Re: Как организовать поиск по нескольким данным в Laravel 4.2?

SMGladkovskiy пишет:

И опять, ман Вам в помощь.


Благодарю за полезную информацию, но я в backend нуб.

Написал так:

$result = Post::where('district_id', '=', $data['district'])
            ->where(function($query) use ($data)
            {
                $query->where('price', '>=', $data['price_min'])
						->where('price', '<=', $data['price_max']);
            })
            ->orWhere('zavtype_id', '=', $data['zavtype'])
			->where(function($query) use ($data)
            {
                $query->where('price', '>=', $data['price_min'])
						->where('price', '<=', $data['price_max']);
            })
			->orWhere('kuhtype_id', '=', $data['kuhtype'])
			->where(function($query) use ($data)
            {
                $query->where('price', '>=', $data['price_min'])
						->where('price', '<=', $data['price_max']);
            })
			->get();

но, код работает, если не трогать max, min price. К примеру, если в Поисковик вбить только минимальную сумму, то ничего не выходит.

И, как сделать, чтобы отображались все посты, если в Поисковике ничего не выбрано, а просто нажали на кнопку?

Не в сети

#7 18.09.2014 21:58:10

Re: Как организовать поиск по нескольким данным в Laravel 4.2?

Пользуйтесь условиями… if ($data[’price_min’]) $query->where(…);

Аналогично с отображением всех постов — если ни один if не сработал условия к запросу не добавятся.

Не в сети

#8 19.09.2014 07:48:40

Re: Как организовать поиск по нескольким данным в Laravel 4.2?

  1. Пользуйтесь условиями… if ($data[’price_min’]) $query->where(…);
  2. Аналогично с отображением всех постов — если ни один if не сработал условия к запросу не добавятся.

Пожалуйста, покажите весь код. Я и в php не профи)

Пишу так:

PHP
            if($data['price_min']){

                
$result Post::where('price''>='$data['price_min'])->get();

            }else
            if(
$data['price_max']){

                
$result Post::where('price''<='$data['price_max'])->get();

            }else
            if(
$data['district']){

                
$result Post::where('district_id''='$data['district'])->get();

            }else
            if(
$data['zavtype']){

                
$result Post::where('zavtype_id''='$data['zavtype'])->get();

            }else
            if(
$data['kuhtype']){

                
$result Post::where('kuhtype_id''='$data['kuhtype'])->get();

            }

Соответственно, условия работают по отдельности. К примеру, если я выберу Район и минимальную Цену, то будет работать только последнее условие(Район, district).

Не смог найти уроков в интернете по данной теме, именно с использованием нескольким данных.

Не в сети

#9 19.09.2014 08:25:37

Re: Как организовать поиск по нескольким данным в Laravel 4.2?

Вам стоит сначала подучить PHP, а затем задавать вопросы про Laravel.

  1. Когда вызывается where() или другой метод запроса на классе модели (Post) — результатом вызова является объект запроса, то есть Query
  2. Соответственно если нужно ограничить результаты одного запроса — на одном и том же объекте Query вызываются новые условия (where)
  3. В вашем коде $result переопределяется 5 раз, это совсем не то, что вам нужно
PHP
$query Post::query();

$data['price_min'] and $query $query->where('price''>='$data['price_min']);
$data['price_max'] and $query $query->where('price''<='$data['price_max']);
$data['district'] and $query $query->where('district_id''='$data['district']);
$data['zavtype'] and $query $query->where('zavtype_id''='$data['zavtype']);
$data['kuhtype'] and $query $query->where('kuhtype_id''='$data['kuhtype']);

$result $query->get();

Не в сети

#10 19.09.2014 09:07:40

Re: Как организовать поиск по нескольким данным в Laravel 4.2?

Вам стоит сначала подучить PHP, а затем задавать вопросы про Laravel.

  1. Когда вызывается where() или другой метод запроса на классе модели (Post) — результатом вызова является объект запроса, то есть Query
  2. Соответственно если нужно ограничить результаты одного запроса — на одном и том же объекте Query вызываются новые условия (where)
  3. В вашем коде $result переопределяется 5 раз, это совсем не то, что вам нужно
PHP
$query Post::query();

$data['price_min'] and $query $query->where('price''>='$data['price_min']);
$data['price_max'] and $query $query->where('price''<='$data['price_max']);
$data['district'] and $query $query->where('district_id''='$data['district']);
$data['zavtype'] and $query $query->where('zavtype_id''='$data['zavtype']);
$data['kuhtype'] and $query $query->where('kuhtype_id''='$data['kuhtype']);

$result $query->get();

Вроде бы все работает как нужно. Спасибо большое!! Ваши ответы на вопросы других пользователей, также помогли мне в разработке. Надеюсь, и этот ответ поможет другим пользователям.

Обстоятельства так сложились, что нужно было быстро разработать сайт + немного изучить php.

Спасибо еще раз!

Не в сети

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