Осталось присоединиться, даже если нет разворота - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть таблица 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();

но я не смог найти способ заставить его работать. Приведенное выше вернет настройки только при наличии опорных точек.

1 Ответ

0 голосов
/ 27 апреля 2020

Потому что вы применяете ->where('setting_user.user_id', $this->id) для настройки запроса.

Это означает, что база данных будет игнорировать те настройки, которые setting_user.user_id НЕДЕЙСТВИТЕЛЬНЫ.

Так что если вы хотите сохранить настройки без setting_user. Вы должны поместить условие в закрытие соединения:

$defaultAndUserSettings = \App\Setting::query()
    ->leftJoin('setting_user', function($join) {
          $join->on('settings.id', '=', 'setting_user.setting_id', 'left outer')
               ->where('setting_user.user_id', $this->id); // Apply where condition here.      
      }) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...