Php 如何获得;名称“;当您通过UserPrefs检索用户和相关时,是否从Prefs表?
我正在使用Laravel5.8,试图找出如何定义关系并获得所需的数据 我有这三张桌子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
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的第二个参数。