【问题标题】:Laravel eloquent: Object of class Closure could not be converted to string join queryLaravel 雄辩:类闭包的对象无法转换为字符串连接查询
【发布时间】:2020-02-07 11:52:35
【问题描述】:

我正在尝试获取所选日期内没有预订的所有车辆:

 $bookings = Booking::all();
 $vehicles = Vehicle::all();

 $selectedStart = Carbon::createFromFormat('d/m/Y H:i',  $request['start']);
 $selectedEnd =  Carbon::createFromFormat('d/m/Y H:i',  $request['end']);


 $availableVehicles = $vehicles->join('bookings', function ($join){
        $join->on('vehicles.id', '=', 'bookings.vehicle_id')
            ->where([
                    ['bookings.start', '<',$selectedStart],
                    ['bookings.end', '<', $selectedStart]
                ])->orWhere([
                    ['bookings.start', '>',$selectedEnd],
                    ['bookings.end', '>', $selectedEnd]
                ]);
  })->get();

但我收到以下错误:

闭包类的对象无法转换为字符串

【问题讨论】:

    标签: php laravel join eloquent


    【解决方案1】:

    在这里使用query() 方法而不是all() 方法,因为all() 方法从数据库中获取行并存储到集合中..

    $bookings = Booking::query();
    $vehicles = Vehicle::query();
    
    $selectedStart = Carbon::createFromFormat('d/m/Y H:i',  $request['start']);
    $selectedEnd =  Carbon::createFromFormat('d/m/Y H:i',  $request['end']);
    
    
    $availableVehicles = $vehicles->join('bookings', function ($join) use ($selectedStart,$selectedEnd){
            $join->on('vehicles.id', '=', 'bookings.vehicle_id')
                ->where([
                        ['bookings.start', '<',$selectedStart],
                        ['bookings.end', '<', $selectedStart]
                    ])->orWhere([
                        ['bookings.start', '>',$selectedEnd],
                        ['bookings.end', '>', $selectedEnd]
                    ]);
    })->get();
    

    【讨论】:

    • 看起来很有希望,但我明白了:未定义的变量 $selectedStart
    • 函数($join)使用($selectedStart, $selectedEnd)
    【解决方案2】:

    标记为正确的答案在技术上是正确的,但您的代码可能会被整理和改进:

    $availableVehicles = Vehicle::query()
        ->join('bookings', function ($join) use ($request){
            $selectedStart = Carbon::createFromFormat('d/m/Y H:i',  $request['start']);
            $selectedEnd   = Carbon::createFromFormat('d/m/Y H:i',  $request['end']);
    
            $join->on('vehicles.id', '=', 'bookings.vehicle_id')
                ->where([
                    ['bookings.start', '<',$selectedStart],
                    ['bookings.end', '<', $selectedStart]
                ])->orWhere([
                    ['bookings.start', '>',$selectedEnd],
                    ['bookings.end', '>', $selectedEnd]
                ]);
        })
        ->get();
    

    您的 $bookings$vehicles 变量此时不相关,除非它们在您未包含的代码中使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-14
      • 1970-01-01
      • 2017-01-05
      • 1970-01-01
      • 1970-01-01
      • 2022-01-24
      相关资源
      最近更新 更多