Laravel. Невозможно использовать Carbon при выполнении запросов с фасадом БД. - PullRequest
1 голос
/ 06 ноября 2019

Мне нужно распределить несколько встреч в календаре, просматривая сотрудников, день и час.

Первый вариант Я сделал это во внешнем интерфейсе, как это. Используя ELOQUENT в бэк-энде

У меня есть цикл внутри цикла, как вы могли видеть здесь:

@for($i = 8; $i <= 17; $i++) // This are the hours. From 9:00 hour to 17:00 hour (German hour format)

    @foreach($employee->appointments as $appointment) // I take the appointment of each employee

        @if( $appointment->date->translatedFormat('D j M') != today()->translatedFormat('D j M')) 

            @continue //if the appointment is not from today, continue

        @else
            @if( $appointment->date->format('H') != $i )
                <h3> <a href="link_to_create_appointment_form">Add an appointment</a></h3>
                // insert a link to create a new apppointment
            @else
                // insert the Appointment
            @endif

        @endif
    @endforeach
@endfor

Но после вставки первого назначения (Назначение == сегодня && now ()), foreach переходит к следующей встрече, но начинается с начала.

В конце, если у меня назначена встреча в 9:00, а другая в 10:00, я получаю следующее:

  1. 8: 00 - добавить встречу
  2. 09: 00 - НАЗНАЧЕНИЕ 1
  3. 8: 00 - добавить встречу
  4. 9: 00 - добавить встречу
  5. 10: 00 - НАЗНАЧЕНИЕ 2

Второй вариант - это использование фасада БД и СОЕДИНЕНИЕ нескольких таблиц (встречи, клиенты, сотрудники и часы работы).

Это приводит к более быстрому решению за один цикл.

Проблема в том, что DB Facade не позволяет использовать Carbon, и я получаю следующую ошибку:

{{ $appointment->date->format('H:i') }}

Этомой запрос:

$todayAppointments = DB::table('appointments')
            ->leftJoin('clients', 'appointments.client_id', '=', 'clients.id')
            ->leftJoin('employees', 'employees.user_id', '=', 'employees.id')
            ->leftJoin('users', 'appointments.employee_id', '=', 'users.id')
            ->whereDay('appointments.date', today())
            ->selectRaw(
                'users.id AS id,
                users.firstname AS employee,
                clients.firstname AS clientname,
                clients.lastname AS clientlastname,
                clients.lastname AS clientlastname,
                clients.gender_id AS clientgender,
                appointments.duration AS duration,
               appointments.date AS date'
            )
            ->groupBy('users.id', 'clients.id', 'appointments.id')
            ->orderBy('date', 'ASC')
            ->get();

ВОПРОС: Как я могу преобразовать результат фасада БД в формат Carbont, чтобы сделать что-то вроде этого:

$appointment->date->format('H') != $i

Я пробовал весь день, используя @loop, @index, но безуспешно.

1 Ответ

2 голосов
/ 06 ноября 2019

$appointment->date не является экземпляром Carbon, если вы используете метод DB::table(), так как создание экземпляра Carbon выполняется с помощью protected $dates = []; в модели. DB::table() возвращает каждую запись ($appointment) как объект StdClass, а не экземпляр модели Appointment. Либо используйте модель для запуска запроса (создайте модель, если у вас ее нет), либо создайте экземпляр Carbon перед форматированием:

В Appointment.php:

 protected $dates = ["date"];

В вашем Controller:

$todayAppointments = Appointment::leftJoin(...)->get();

В вашем view.blade.php:

@foreach($todayAppointments AS $appointment)
{{ $appointment->date->format("H:i") }}
@endforeach

Или, если вы хотите использовать DB::table() подход:

В вашем view.blade.php:

@foreach($todayAppointments AS $appointment)
{{ \Carbon\Carbon::parse($appointment->date)->format("H:i") }}
@endforeach
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...