Php 如何获得;名称“;当您通过UserPrefs检索用户和相关时,是否从Prefs表?

Php 如何获得;名称“;当您通过UserPrefs检索用户和相关时,是否从Prefs表?,php,laravel,eloquent,Php,Laravel,Eloquent,我正在使用Laravel5.8,试图找出如何定义关系并获得所需的数据 我有这三张桌子 Users: id, name, email 数据示例 1, Vegetarian Only 2, Non-Veg Only 3, No preferences 4, Vegan Only 我想访问用户的所有帐户首选项。这些是我的模型课 class User extends Model { public function preferences() { return $thi

我正在使用Laravel5.8,试图找出如何定义关系并获得所需的数据

我有这三张桌子

Users: id, name, email
数据示例

1, Vegetarian Only
2, Non-Veg Only
3, No preferences
4, Vegan Only
我想访问用户的所有帐户首选项。这些是我的模型课

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()运行查询,如
从userpreferences中选择*,其中user_id=134

然而,我希望能够从这个查询中获得结果-
SELECT*,pf.name pref\u name FROM userpreferences upf internal JOIN Preferences pf ON pf.id=upf.preference\u id,其中upf.user\u id=134
这样定义关系的唯一原因是允许相同的
用户id,preference\u id
对。如果您不需要此选项,则应将
用户首选项
表转换为透视表。以下是您要做的:

1) 从
用户首选项中删除
id

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
$prefs = $user->preferences()->with('preference')->get();
$prefs->first()->preference->name; //here it is
如果仍要保留
用户首选项
,可以执行以下操作:

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;
$prefs->first()->name;  //Here it is
$prefs->first()->pivot->approved; //The approved value
$prefs = $user->preferences()->with('preference')->get();
$prefs->first()->preference->name; //here it is

你的意思是你想从首选项中获得额外的栏位。是的,请查看我的问题中的上述更新。上述情况是否意味着用户可以多次拥有相同的首选项?@apokryfos-否-用户没有重复的首选项,但他们可以拥有多个不同的首选项。基本上,首选项是一个列表。管理员可以将此列表中的一个或多个首选项分配给任何用户帐户。谢谢-让我试试。另外,我可以在一行中获取所有数据,以便将一个变量传递给我的刀片文件吗?例如,
dd($user)
。。。将输出
array('id'=>1,“name”=>“Joe”,“preferences”=>array(“id”=>4,“user\u id”=>1,“prefName”=>“Veg Only”))
@NoNice我已经写了一个不同的答案,我认为这会更好。如果你把
user\u preferences
定义为一个透视表,你就避免了一些异常现象,比如同一个用户多次拥有相同的偏好,就像一个用户可能3次成为素食主义者(我认为这没有意义)是的,你最初的答案对我有效。我能够定义关系,但不知道如何检索值,因此
$prefs=$user->preferences()->with('preference')->get()$prefs->first()->首选项->名称帮助我理解了如何获得它。所以,谢谢你。另外,我明白你的观点,重新使用pivot。但是,我有一个使用相同数据库的现有非laravel应用程序,因此无法更改模式。但我相信我会记住这一点,以便将来有新的发展。我需要先弄清楚这是怎么回事。是的。您可以将其更改为BelongToMany的第二个参数。