Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Добрый день!
Подскажите, как сделать поиск по нескольким данным?
Имеется форма:
{{ 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 начинающий.
Не в сети
А где сам запрос? Что смотреть-поправлять-подсказывать?
По нескольким данным нужно делать запрос с несколькими where(). Ман в помощь для начала...
Не в сети
}%А в чём проблема?
%%
YourModel::where('price', '>', 123)->where('price', '<', 456)->where('district_id', '=', 9)->...->get()
%%
**SMGladkovskiy** дал ссылку на доки, читайте. На русском есть ((http://laravel.ru/docs/v4/eloquent тут)).
Спасибо! Только вот, если не указывать, к примеру, максимальную сумму, то выдает ошибку.
Не в сети
И опять, ман Вам в помощь.
Не в сети
И опять, ман Вам в помощь.
Благодарю за полезную информацию, но я в 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. К примеру, если в Поисковик вбить только минимальную сумму, то ничего не выходит.
И, как сделать, чтобы отображались все посты, если в Поисковике ничего не выбрано, а просто нажали на кнопку?
Не в сети
Не в сети
- Пользуйтесь условиями… if ($data[’price_min’]) $query->where(…);
- Аналогично с отображением всех постов — если ни один if не сработал условия к запросу не добавятся.
Пожалуйста, покажите весь код. Я и в 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).
Не смог найти уроков в интернете по данной теме, именно с использованием нескольким данных.
Не в сети
Вам стоит сначала подучить PHP, а затем задавать вопросы про Laravel.
$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, а затем задавать вопросы про Laravel.
- Когда вызывается where() или другой метод запроса на классе модели (Post) — результатом вызова является объект запроса, то есть Query
- Соответственно если нужно ограничить результаты одного запроса — на одном и том же объекте Query вызываются новые условия (where)
- В вашем коде $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.
Не в сети