试图用三个表(用户、个人资料、国家)修复我的 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 获取用户国家

如何修复“试图获取非对象的属性”Laravel 5

我试图制作颤动的网络,但当我选择不显示的图像时,我的个人资料图片有问题

C++链表删除节点

国家保护和修复问题

修复mysql表