【问题标题】:laravel- Eloquent relationship between users, user infos, user addresss, and user contactslaravel - 用户、用户信息、用户地址和用户联系人之间的雄辩关系
【发布时间】:2020-02-25 18:21:04
【问题描述】:

我正在我的 laravel 项目中创建一堆模型。有四个模型,这意味着我的数据库中有四个表。即模型为UserUserInfoUserAddressUserContact。用户表为主表,列结构如下:

users -> id , email, password,....other unimportant stuff.
user_info -> id, name, identity num, ......
user_address -> id, user_id, address1, address2,address3, shipping address,....
user_contact-> id, user_id, mobile_num,emergency_num,......

如您所见,id 列是了解任何用户全部信息的关键标识符。我试图在他们四个之间定义一种雄辩的关系,但不知道我是否正确。这是我目前所拥有的:

用户模型:

 public function user_info(){



        return $this->hasOne('App\Models\UserInfo');
    }


    public function user_address(){
        return $this->hasOne('App\Models\UserAddress');

    }



    public function user_contact(){

        return $this->hasOne('App\Models\UserContact');
    }

用户信息模型:

    public function user(){

        return $this->belongsTo('App\Models\User');

    }


    public function user_address(){

        return $this->hasMany('App\Models\UserAddress');
    }


    public function user_contact(){

        return $this->hasMany('App\Models\UserContact');
    }

用户地址模型:

    public function user(){

        return $this->belongsTo('App\Models\User');
    }



    public function user_info(){

        return $this->belongsTo('App\Models\UserInfo');
    }



    public function user_contact(){

        return $this->hasMany('App\Models\UserContact');
    }

用户联系模型:

    public function user(){

        return $this->belongsTo('App\Models\User');
    }


    public function user_info(){

        return $this->belongsTo('App\Models\UserInfo');
    }


    public function user_address(){


        return $this->belongsTo('App\Models\UserAddress');

    }

所以问题是我不确定,例如,用户是联系用户地址的孩子还是相反?

用户是否联系用户信息的孩子?

有人能解释一下吗?

欣赏它。

【问题讨论】:

  • 你在user_info 表上没有user_id 吗?
  • 您提供的细节太少,无法回答您的问题。例如。你的 User 模型 hasOne UserAddress 和 hasOne UserContact 为什么 UserAddress 模型会有很多 UserContactuser_address 表中指向user_address 表的外键是哪个键?这是我看到的第一件事,但似乎有更多的不一致之处,您需要对用例提供更好的解释,以便我们了解您想要实现的目标。
  • 我很抱歉,因为我在更改代码之前输入了错误的一些信息。你现在可以忽略这些。基本上,一个用户有一个用户信息,但可以有多个地址和多个联系人。事情就是这样。信息够了吗?

标签: php laravel


【解决方案1】:

您好,只需将所有关系保留在 User 模型中并通过它访问它们。在其他模型中,只是与用户模型的关系。我是你的结构稍作修改,让用户为默认送货地址添加多个地址复选框,如果你愿意,你也可以只保留一个联系人。

users -> id , email, password,....other unimportant stuff.
user_info -> id,user_id ,name, identity num, ......
user_address -> id, user_id, address,shipping address,....
user_contact-> id, user_id, mobile_num,emergency_num,......

用户模型

public function user_info(){
        return $this->hasOne('App\Models\UserInfo');
}


 public function user_address(){
      return $this->hasMany('App\Models\UserAddress');
 }

  public function user_contact(){

      return $this->hasMany('App\Models\UserContact');
  }

在你所有其他与用户相关的模型中添加这个

public function user(){

    return $this->belongsTo('App\Models\User');
}

你可以通过用户模型访问关系

$user_info = UserInfo::with('user')->first();
$user_info->user->user_contact();

如果只是用户模型

$user = User::with(['user_info','user_contact','user_address'])->first();
echo $user->user_info->name;

更新

user_id 是除用户表之外的每个表中的外键,如果要测试关系创建用户数据库种子和 4 个工厂(用户、用户地址、用户联系人、用户信息)来填充假数据,在创建模型和数据后数据库获取第一个用户并调用它的关系,对其他模型做同样的事情,从这个模型中获取第一条记录并调用用户关系。

这是我的 UserTableSeeder 类运行方法

public function run()
    {
        factory(App\User::class, 10)->create()->each(function ($user) {
            $user->user_address()->save(factory(App\Models\UserAddress::class)->make());
            $user->user_contact()->save(factory(App\Models\UserContact::class)->make());
            $user->user_info()->save(factory(App\Models\UserInfo::class)->make());
        });
    }

【讨论】:

  • 我需要指定外键/主键吗?
  • 还有,我在做完模型后如何测试它们之间的关系?
  • Laravel 已完成注册验证。是否可以将注册表拆分为三个不同的用户?例如,我想注册,但我可以选择普通用户、特殊用户或经销商的注册形式。可能吗?每个用户注册表单彼此不同,可能有些字段有额外的文本等
  • 是的,可以使用这个包,您可以定义角色、用户、特殊用户或经销商,并根据他们的角色授予我权限github.com/spatie/laravel-permission
  • 设置很多吗?
猜你喜欢
  • 1970-01-01
  • 2014-01-29
  • 1970-01-01
  • 2016-08-30
  • 2016-10-28
  • 2013-02-05
  • 1970-01-01
  • 2021-06-03
  • 2019-03-25
相关资源
最近更新 更多