Как получить «имя» из таблицы Prefs, когда вы получаете пользователя и связанные через UserPrefs? - PullRequest
0 голосов
/ 29 марта 2019

Я использую Laravel 5.8 и пытаюсь выяснить, как определить отношения и получить нужные данные.

У меня есть эти три таблицы.

Users: id, name, email
Preferences: id, name

Пример данных,

1, Vegetarian Only
2, Non-Veg Only
3, No preferences
4, Vegan Only
UserPreferences: id, user_id,preference_id, approved ('Yes', 'No')

Я хочу получить доступ ко всем настройкам учетной записи пользователя. Это мои классы моделей.

class User extends Model
{
    public function preferences()
    {
        return $this->hasMany('App\UserPreference', 'user_id', 'id'); 
        //model, foreign_key, local_key
    }
}

class Preference extends Model
{
  // just default empty model class
}

class UserPreference extends Model
{
 // just default empty model class
}

Когда я делаю

$user = User::find(134);
$pref = $user->preferences()->get();
dd($pref);

Когда я делаю $pref = $user->preferences()->get();, он включает все поля из таблицы UserPreferences выше, но я хочу включить name в качестве prefName из таблицы preferences.

Я не уверен, как это сделать. Не могли бы вы помочь мне правильно определить отношения?

Обновление

В основном, $pref = $user->preferences()->get(); выполняет запрос как SELECT * FROM UserPrefererences WHERE user_id=134

Тем не менее, я хочу быть в состоянии достичь результата из этого запроса - SELECT *, pf.name pref_name FROM UserPrefererences upf INNER JOIN Preferences pf ON pf.id = upf.preference_id WHERE upf.user_id=134

1 Ответ

1 голос
/ 29 марта 2019

Единственная причина, по которой вы определяете свои отношения подобным образом, - разрешить одну и ту же пару user_id, preference_id.Если вам это не нужно, вам следует преобразовать таблицу user_preferences в сводную таблицу.Вот что вы делаете:

1) Удалите столбец id из user_preferences

2) Полностью удалите класс UserPreference

3) Определите ваши отношения какниже:

class User extends Model
{
    public function preferences()
    {
        return $this->belongsToMany('App\Preference')->withPivot('approved'); 
    }
}

Затем вы можете сделать:

$prefs = $user->preferences;
$prefs->first()->name;  //Here it is
$prefs->first()->pivot->approved; //The approved value

Если вы все еще хотите сохранить UserPreferences, вы можете сделать следующее:

class User extends Model
{
    public function preferences()
    {
        return $this->hasMany('App\UserPreference', 'user_id', 'id'); 
        //model, foreign_key, local_key
    }
}

class UserPreference extends Model
{
       public function preference() {
           return $this->belongsTo('App\Preference');
       }
}

Тогда вы можете сделать:

$prefs = $user->preferences()->with('preference')->get();
$prefs->first()->preference->name; //here it is
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...