У меня есть таблица settings
, в которой содержатся все возможные настройки и значения по умолчанию для каждого из них. У меня также есть таблица setting_user
, которая содержит пользовательские настройки. Это сводная таблица между пользователем и настройкой. Если в UserA существует строка в setting_user
, она переопределяет значение по умолчанию для параметра. Если в setting_user
для UserA нет строки, то значение параметра является значением по умолчанию.
Вот моя миграция:
Schema::create('settings', function (Blueprint $table) {
$table->uuid('id')->primary();
$table->text('description');
$table->string('key');
//$table->json('default_value')->nullable();
$table->text('default_value')->nullable();
$table->timestamps();
});
Schema::create('setting_user', function (Blueprint $table) {
$table->uuid('id')->primary();
$table->uuid('user_id')->index();
$table->uuid('setting_id')->index();
$table->text('setting_value')->nullable();
$table->timestamps();
});
Я хочу вернуть коллекцию ВСЕХ строк в таблице settings
для UserA с объединением на setting_user
.
Другими словами, если в таблице settings
имеется 50 строк, я хочу вернуть 50 элементов, независимо от того, есть ли у UserA запись соответствия / сводки для каждого в setting_user
.
Вариант использования следующий: пользователи могут иметь пользовательские настройки (значение пользовательской настройки содержится в setting_user
в столбце setting_value
). Если они никогда не устанавливают пользовательские настройки, сводная строка не существует, поэтому мы рассматриваем значение настройки как столбец default_value
в таблице settings
.
Я начал с чего-то подобного, в \App\User
:
$defaultAndUserSettings = \App\Setting::query()
->join('setting_user', 'settings.id', '=', 'setting_user.setting_id', 'left outer')
->where('setting_user.user_id', $this->id)
//-> plus also all other Setting rows where the user has no pivot for
->get();
но я не смог найти способ заставить его работать. Приведенное выше вернет настройки только при наличии опорных точек.