Laravel Eloquent:如果行不存在,则返回一些值

时间:2019-07-02 09:33:47

标签: mysql eloquent laravel-5.8

我有以下方法:

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

1 个答案:

答案 0 :(得分:0)

渴望加载关系时,始终需要选择外键(在这里:bookings_client_option_id)。 Laravel要求将结果与父母配对。

您的关系确实选择了此列,但是闭包覆盖了所选择的列。结果,查询仅选择booking_attendee_idvalue,结果为空。

删除select()子句:

$query->with('bookingsClientsOptionsData')