Как насчет слияния двух результатов или необработанного выражения?
Я реализую весь ваш код и вижу ту же сложность ... Поэтому я нашел эти решения не очень элегантными, но функциональными.
Альтернатива 1 - Результаты слияния:
//user
$u = DB::table('users')->join('settings', 'users.id', '=', 'settings.user_id')->get();
//settings without user_id
$n = DB::table('settings')->where('settings.user_id', '=', null)->get();
//all together
$result = $u->merge($n);
Мой вывод на php Ремесленник
>>> $result = $u->merge($n);
=> Illuminate\Support\Collection {#3019
all: [
{#3015
+"id": "2",
+"name": "name 123",
+"email": "teste123@teste.com",
+"email_verified_at": "2020-04-22 20:54:06",
+"password": "1111111111111111111",
+"remember_token": "1111111111111111111",
+"created_at": "2020-04-22 21:13:50",
+"updated_at": "2020-04-22 21:13:50",
+"user_id": "123",
+"description": "desc",
+"setting_key": "conf",
+"setting_value": "configuration-configuration",
},
{#3031
+"id": "1",
+"user_id": null,
+"description": "desc",
+"setting_key": "conf",
+"setting_value": "configuration-configuration",
+"created_at": "2020-04-22 21:13:50",
+"updated_at": "2020-04-22 21:13:50",
},
],
}
Альтернатива 2 - Необработанное выражение:
$id = 123;
$r = DB::select(DB::raw("select * from settings where settings.user_id in ('{$id}') or settings.user_id is null"));