当您检索用户并通过UserPrefs相关时,如何从Prefs表中获取“名称”?

时间:2019-03-29 16:33:05

标签: php laravel eloquent

我正在使用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')

我想访问用户的所有帐户首选项。这些是我的Model类。

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表中的preferences作为prefName包括在内。

我不确定该怎么做。能帮我正确定义关系吗?

更新

基本上,$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 个答案:

答案 0 :(得分:1)

这样定义关系的唯一原因是允许相同的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