Je veux obtenir une requête par différents paramètres sélectionnés

Mais pour le moment, il ne fait que filtrer séparément. Ceci est mon contrôleur:

    $cityId = $request->input('city_id');
    $category = $request->input('categories');
    $search = $request->input('search');

    if(isset( $cityId) || isset($category) || isset($search )){
        $companies = \App\Company::orWhere('city_id', '=', $cityId)
        ->orWhereHas('categories',
        function ($query) use ($category) {
            $query->where('id', $category);
        })->orWhere('name', '=', $search)
        ->get();
     }else{
        $companies = \App\Company::all();
     }`

Pour le moment, si je sélectionne une ville et une catégorie fonctionne bien, mais si je recherche également un nom, cela devrait m'apporter le nom de l'entreprise dans la liste des villes / catégories ou vide.

Ma vue ressemble à ceci:

    `{!! Form::open([ 'action' => 'HomePageController@index', 'method' => 'get']) !!}

<div class="container">
    <div class="col-xs-2 form-inline">
        {!! Form::label('city_id', trans('quickadmin.companies.fields.city').'', ['class' => 'control-label']) !!}
        {!! Form::select('city_id', $cities, old('city_id'), ['class' => 'form-control select2']) !!}
    </div>

    <div class="col-xs-3 form-inline">
        {!! Form::label('categories', trans('quickadmin.companies.fields.categories').'', ['class' => 'control-label']) !!}
        {!! Form::select('categories', $categories, old('categories'), ['class' => 'form-control select2']) !!}
    </div>
    <div class="col-xs-3 form-inline">
        {!! Form::label('search', trans('quickadmin.companies.fields.name').'', ['class' => 'control-label']) !!}
        {!! Form::text('search', old('search'), ['class' => 'form-control', 'placeholder' => 'Search']) !!}
        <p class="help-block"></p>
    </div>
    <div class="form-inline">
        <div class="col-xs-2">
            <button type="submit"
                    class="btn btn-primary">
                    Search
            </button>
        </div>
    </div>
</div>

{!! Form::close() !!}

</div>
<br>
@if (count($companies) > 0)
    @foreach ($companies as $company)
    <div class="container">
        <div class="row">
            <div class="col-xs-2">@if($company->logo)<a href="{{ asset(env('UPLOAD_PATH').'/' . $company->logo) }}" target="_blank"><img src="{{ asset(env('UPLOAD_PATH').'/thumb/' . $company->logo) }}"/></a>@endif </div>
            <div class="col-xs-10">
                {{$company->name}}
                <br>
                {{$company->address}}, {{ $company->city->name or '' }}
                <br>
                @foreach ($company->categories as $singleCategories)
                    <span class="label label-info label-many">{{ $singleCategories->name }}</span>
                @endforeach
                <br>
                {{$company->description}} 
                <hr>    
            </div>
        </div>
    </div>`

companies table

categories table

enter image description here

0
Darius 28 nov. 2017 à 13:05

3 réponses

Meilleure réponse

Là, j'ai trouvé ma réponse: https: // laracasts. com / discuter / canaux / éloquent / multiple-where-clauses-from-get-variables

J'espère que cela aidera quelqu'un.

Je viens de mettre à jour mon modèle avec la fonction:

public function scopeFilterByRequest($query, Request $request)
{
    if ($request->input('city_id')) {
        $query->where('city_id', '=', $request->input('city_id'));
    }

    if ($request->input('categories')) {
        $query->whereHas('categories',
        function ($query) use ($request) {
            $query->where('id', $request->input('categories'));
        });
    }

    if ($request->input('search')) {
        $query->where('name', '=', $request->input('search'));
    }

    return $query;
}

Et simplement ajouté à mon contrôleur:

$companies = \App\Company::filterByRequest($request)->paginate();
0
Darius 28 nov. 2017 à 13:13

Puisque vous utilisez orWhere, les noms qui ne sont pas inclus dans la requête de recherche sont également renvoyés. Puisque vous dites que vous n'avez besoin que de l'entreprise dont le nom est entré dans le champ de recherche, cela ne semble pas être le comportement souhaité.

Changement

orWhere('name', '=', $search) 

À

where('name', '=', $search)
0
piscator 28 nov. 2017 à 10:09

Si je comprends votre problème. Vous devez essayer le code ci-dessous .. Essayez toujours de partitionner la requête lorsque vous filtrez les données.

$cityId = $request->input('city_id');
$category = $request->input('categories');
$search = $request->input('search');

$companies = DB::table('companies');
if(isset($cityId) && !empty($cityid)){
    $companies = $companies->where('city_id',$cityid);
 }
if(isset($category) && !empty($category)){
    $companies = $companies->orWhereHas('categories',
    function ($query) use ($category) {
        $query->where('id', $category);
    });
 }

 if(isset($search) && !empty($search)){
    $companies = $companies->where('name', $search)
}
$companies = $companies->get();
dd($companies);

J'espère que cela aide!

0
kunal 28 nov. 2017 à 10:20
47528770