试图用三个表(用户、个人资料、国家)修复我的 Laravel 7 Eloquent 关系
Posted
技术标签:
【中文标题】试图用三个表(用户、个人资料、国家)修复我的 Laravel 7 Eloquent 关系【英文标题】:Trying to fix my Laravel 7 Eloquent relationship with three tables (Users, Profiles, Countries) 【发布时间】:2021-12-08 22:15:11 【问题描述】:我正在尝试在“用户”、“个人资料”和“国家/地区”表之间建立关系。
Users 表包含以下列:id - name - email - password Profiles 表包含以下列:id - user_id - country_id Countries 表包含以下列:id - name - code问题是目前我的代码将用户 id 直接与国家表中的 id 匹配(用户一获得国家一,用户二 - 国家二等)。但我想做的是将配置文件表中的 country_id 与国家表中的国家/地区 id 匹配(因此用户 1 的配置文件的 country_id 为 5,从而获得国家表中 id 为 5 的县)。任何纠正此问题的帮助将不胜感激。
我的用户模型
class User extends Authenticatable implements MustVerifyEmail
use HasFactory, Notifiable, Commenter;
public function country()
// if I remove 'id' I get the error "Unknown column 'countries.user_id'"
return $this->hasOne(Country::class, 'id');
public function profile()
return $this->hasOne(Profile::class);
我的个人资料模型
class Profile extends Model
use HasFactory;
public function user()
return $this->belongsTo(User::class);
public function country()
return $this->belongsTo(Country::class);
我的国家模式
class Country extends Model
use HasFactory;
public function user()
return $this->hasMany(Profile::class);
我的用户控制器
class UserController extends Controller
public function singleUserData($userId)
$singleUserData= User::where('id', $userId)->with('country','profile')->get();
return view('single-user-data', ['singleUserData' => $singleUserData]);
public function allUsersData()
$allUsersData = User::with('profile','country')->get();
return view('all-users-data', ['allUsersData' => $allUsersData]);
【问题讨论】:
【参考方案1】:你们的关系有点不正常。
您的个人资料模型是正确的 - 每个个人资料属于一个国家和一个用户。
不正确的是您的用户和国家/地区模型。您的用户没有“拥有一个”国家/地区,因为用户和国家/地区之间没有直接关系 - 它通过个人资料模型。因此,您正在寻找的是,您的用户使用“hasOneThrough”关系来查找其国家/地区。
相反,每个国家/地区将(可能)有很多用户,但不是直接通过配置文件模型,因此您的国家/地区需要使用“hasManyThrough”关系来查找其用户.
【讨论】:
我添加到国家模型public function user()return $this->hasManyThrough(Country::class, Profile::class);
和用户模型public function user()return $this->hasOneThrough(Country::class, Profile::class);
但我收到错误“未知列'countries.profile_id'”我一直在摆弄添加附加参数hasOneThrough ex:(Country::class, Profile::class, 'country_id', 'user_id', 'id', 'id')
,但我能做的最好的就是为用户获取 null 的国家/地区值。
我讨厌必须解决这些问题,但是根据过去的经验,我认为您应该看看:(Country::class, Profile::class, 'user_id', 'id', ' id'、'country_id'、'profiles')
是的,行得通!谢谢你。我能问一下你怎么知道给 hasOneThrough 添加一个额外的参数? laravel 文档以“第五个参数是本地键,而第六个参数是中间模型的本地键”结尾。如果没有你给我看,我永远不会知道添加第七个参数。
我认为,实际上,它是多余的(它是表名,但如果有任何异常,它应该从您的 Profile 模型中获取它(它希望名为“Profile”的模型有一个名为“ profile”默认情况下,但我倾向于自动将表名放入模型中)。我认为您的问题是 user_id 和 country_id 参数的位置/顺序错误。以上是关于试图用三个表(用户、个人资料、国家)修复我的 Laravel 7 Eloquent 关系的主要内容,如果未能解决你的问题,请参考以下文章
React Native Firebase Analytics 获取用户国家