Laravel Eloquent: возвращает значение, если строка не существует - PullRequest
0 голосов
/ 02 июля 2019

У меня есть следующий метод:

public function getBookings (Request $request) {

    $bookings = Bookings::where('client_department_id', '=', $request->segment(3))
        ->where('status', '=', $request->segment(5))
        ->with(['clientsDepartments' => function($query) {
            $query->select(
                'client_department_id',
                'department_name'
            )
            ->with(['bookingsClientsOptions' => function($query) {
                $query->with(['bookingsClientsOptionsData' => function($query) {
                    $query->select(
                        'booking_attendee_id',
                        'value'
                    )
                        ->orderBy('creation_date', 'desc');
                }])
                    ->orderBy('bookings_client_option_id', 'desc');
            }])
                ->orderBy('department_name', 'desc');
        }])
            ->orderBy('creation_date')
            ->take(10)
            ->get();

    return BookingsResource::collection($bookings)->response();

}

Здесь bookingsClientsOptions - это n количество строк, определяющих параметры клиента, а bookingsClientsOptionsData - это сами значения.

Однако пользователю не требуется вводить значения для каждой из опций клиента, чтобы, например, у опции 1 и 2 клиента могли быть значения, а у 3 - нет, у 4 - нет, а у 5 - нет. «т.

Мне нужно извлечь существующие значения и либо null , либо [] там, где их нет, чтобы заполнить пробелы.

Если вы посмотрите на графику, она создает массив bookings_clients_options и массив bookings_clients_options_data, в котором содержатся параметры клиента, но не помещает в него данные строки, несмотря на то, что оператор Eloquent генерирует извлекает правильные данные строки.

В соответствии с запросом, отношения в "app / BookingsClientsOptions.php":

public function clientsDepartments () {
    return $this->belongsTo(
        'App\ClientsDepartments',
        'client_department_id'
    );
}

public function bookingsClientsOptionsData () {
    return $this->hasMany(
        'App\BookingsClientsOptionsData',
        'bookings_client_option_id'
    )
    ->select([
        'bookings_client_option_data_id',
        'bookings_client_option_id',
        'booking_attendee_id',
        'value'
    ])
    ->orderBy('creation_date', 'desc');
}

... и "app / BookingsClientsOptionsData.php":

public function bookingsClientsOptions () {
    return $this->hasOne(
        'App\BookingsClientsOptions',
        'bookings_client_option_id'
    );
}

public function attendees () {
    return $this->belongsTo(
        'App\BookingsAttendees',
        'booking_attendee_id'
    );
}

A graphic of the code in Google Chrome* * 1030

1 Ответ

0 голосов
/ 09 июля 2019

Когда вы хотите загрузить отношения, вам всегда нужно выбрать внешний ключ (здесь: bookings_client_option_id).Laravel требует, чтобы результаты соответствовали их родителям.

Ваши отношения выбирают этот столбец, но закрытие перезаписывает выбранные столбцы.В результате в запросе выбираются только booking_attendee_id и value, что приводит к пустому результату.

Удалите предложение select():

$query->with('bookingsClientsOptionsData')
...