2 votes

Clause Where avec plusieurs valeurs dans Laravel 5.7

J'essaie de créer un rapport pour le système de transport par bus. Le formulaire du rapport comporte des champs "Conducteur" et "Itinéraire". Cela fonctionne bien lorsque je sélectionne "Conducteur" pour obtenir un rapport ou que je sélectionne uniquement "Itinéraire" pour obtenir le rapport, mais quelque chose ne va pas lorsque je choisis à la fois "Conducteur et Itinéraire". Toute aide serait appréciée.

Vue/Forme

<form action="" method="get">
    <div class="row">
        <div class="col-md-3 form-group">
            <label>From Date:</label>
            <input type="date" name="start" class="form-control">
        </div>
        <div class="col-md-3 form-group">
            <label>To Date:</label>
            <input type="date" name="end" class="form-control">
        </div>
    </div>
    <div class="row">
        <div class="col-md-3" id="route_content">
            <label>Route</label>
            <select name="routeid" id="route_id" class="js-example-placeholder-singleuserid js-states form-control"
                    style="width: 100%; height:40px;">
                <option></option>
                <?php foreach ($routes as $key => $value): ?>
                <option value="{{$value->id}}">{{$value->from}} -> {{$value->to}}</option>
                <?php endforeach ?>
            </select>
        </div>
        <div class="col-md-3" id="driver_content" z>
            <label>Driver</label>
            <select name="driverid" id="driver_id" class="js-example-placeholder-single js-states form-control"
                    style="width: 100%; height:40px;">
                <option></option>
                <?php foreach ($driver as $key => $value): ?>
                <option value="{{$value->id}}"> {{$value->name}} </option>
                <?php endforeach ?>
            </select>
        </div>
    </div>
    <div class="row">
        <div class="col-md-3 form-group">
            <button class="btn btn-info btn-md" style="margin-top: 27px;">Search</button>
        </div>
    </div>
</form>

Route

 Route::get('post_genral_report/{start?}/{end?}' , 
'reportController@post_genral_report')->name('abd');

Contrôleur

public function post_genral_report(Request $request, $start = null, $end = null)
{
    $data = DB::table('registration_tickets')
        ->join('trips', 'trips.id', 'registration_tickets.trip_id')
        ->join('buses', 'buses.id', 'trips.bus_id')
        ->join('drivers', 'drivers.id', 'trips.driver_id')
        ->join('routes', 'routes.id', 'trips.route_id')
        ->join('provinces as p1', 'p1.id', 'routes.from')
        ->join('provinces as p2', 'p2.id', 'routes.to')
        ->select('registration_tickets.*', 'p1.name as from', 'p2.name as to', 'buses.type', 'buses.plate',
            'drivers.name as d_name', 'drivers.lastname as lname');

    if ($start and $end) {
        $data->whereBetween('registration_tickets.date', [
            $start,
            $end
        ]);
    }

    if ($request->driverid) {
        $data->where('trips.driver_id', $request->driverid);
    }

    if ($request->routeid) {
        $data->where('trips.route_id', $request->routeid);

    }

    if ($request->driverid and $request->routeid) {
        $data->where([
            'trips.driver_id', '=', $request->driverid,
            'trips.route_id', '=', $request->routeid
        ]);
    }

    $data = $data->get();

    return Datatables::of($data)->make(true);
}

2voto

Inderpreet Singh Points 183

Vous devez modifier la partie où vous utilisez à la fois driver_id et route_id pour atteindre votre objectif (parce que selon votre code, il semble que vous voulez les résultats lorsque les deux route_id ou driver_id se situent entre la date de début et de fin, cependant votre code vérifie le driver_id et route_id individuellement pour la condition where. Vous devez les envelopper dans un where et utiliser des where imbriqués dans celui-ci) :

if ($request->driverid and $request->routeid) {
    $data->where(function($q) use ($request)
    {
        $q->where('trips.driver_id', '=', $request->driverid)
        ->where('trips.route_id', '=', $request->routeid);
    });
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X