【问题标题】:Where clause with multiple values in Laravel 5.7Laravel 5.7 中具有多个值的 Where 子句
【发布时间】:2019-11-06 20:40:53
【问题描述】:

我正在尝试为公共汽车运输系统制作报告,报告的表格有“司机”和“路线”字段。当我选择“驱动程序”来获取报告或只选择“路线”来获取报告时,它工作正常,但是当我同时选择“驱动程序和路线”时出现问题。任何帮助将不胜感激

视图/表单

<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::get('post_genral_report/{start?}/{end?}' , 
'reportController@post_genral_report')->name('abd');

控制器

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);
}

【问题讨论】:

  • 您不需要if ($request-&gt;driverid and $request-&gt;routeid) { $data-&gt;where([ 'trips.driver_id', '=' , $request-&gt;driverid, 'trips.route_id', '=' , $request-&gt;routeid ]); }。因为如果您同时输入上面的值代码,则已经应用了这两个条件。尝试删除这部分。
  • “出了点问题”怎么了?
  • @DhananjayKyada 正如你所说,我删除了这部分。但什么都没有改变,
  • @Viney 正如我所说的那样,当我单独获取报告时它工作正常,例如我只想为 "Driver" 或 Just for "Route" 获取报告,但是当我同时选择两者时它不会工作正常,有点忽略驱动程序,它只为“路线”排序
  • @Reza。您确定至少有一个记录满足这两个条件吗?请先检查。

标签: php mysql ajax laravel laravel-5.7


【解决方案1】:

您需要将同时使用 driver_id 和 route_id 的部分修改为以下以实现您的目的(因为根据您的代码,当 route_id 或 driver_id 都在开始日期和结束日期之间时,您似乎想要结果, 但是您的代码会分别检查 driver_id 和 route_id 的 where 条件。您需要将它们包装在 where 中并在其中使用嵌套 where):

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);
    });
}

【讨论】:

  • 非常感谢,但仍然忽略提交的驱动程序,只获取路线报告
  • 好的,我知道您需要基于司机和路线的报告,而不是 or 条件。您的代码中的问题是它分别检查 driver_id 和 route_id 的 where 条件。您需要将它们包装在 where 并在其中使用嵌套的 where ,然后它只会给出两个条件都满足的结果。请检查我更新的解决方案。
猜你喜欢
  • 2016-01-04
  • 1970-01-01
  • 1970-01-01
  • 2019-03-14
  • 2020-09-28
  • 2018-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多