Laravel eloquent: объект класса Closure не может быть преобразован в запрос объединения строк - PullRequest
0 голосов
/ 07 февраля 2020

Я пытаюсь получить все транспортные средства, у которых нет бронирования на выбранные даты:

 $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();

Но я получаю следующую ошибку:

Объект класса Closure невозможно преобразовать в строку

Ответы [ 2 ]

1 голос
/ 07 февраля 2020

Ответ, помеченный как правильный, технически верен, но ваш код может быть исправлен и улучшен:

$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 переменные на данном этапе не имеют значения, если только они используется в коде, который вы не включили.

1 голос
/ 07 февраля 2020

здесь используется метод 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...