我正在使用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
答案 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