Laravel 5.6 |雄辩的一对多关系

时间:2018-06-05 04:45:26

标签: php laravel eloquent

我正在学习php和laravel。我正在为公司做一次测试,如果我通过,我可以考虑加入开发团队。 crud测试的要求之一是成员(主要对象)可能有多种语言选项列表中的一种语言。显然,一种语言可以链接到多个成员。

因此,如果我正确阅读了laravel文档,将自动设置主模型(Member)和辅助模型(Language)之间的外键。我的问题是如何在逻辑上建立关系。

我的成员表中的一列是language_id列,而language表由id(显然)和语言名称组成。

根据例子,这种关系应该是这样的:

会员模特:

class Member extends Model 
{ 
   public function language() 
   { 
      return $this->hasMany('App\Language'); 
   } 
}

语言模型:

class Language extends Model 
{ 
   public function member() 
   { 
      return $this->belongsTo('App\Member'); 
   } 
}

但这有意义吗?会员模型基本上是说会员可以有多种语言。但事实并非如此。该成员只能使用一种语言。

你能帮我解释一下这个问题。

由于

2 个答案:

答案 0 :(得分:1)

你的关系错了。

由于成员只能使用一种语言,因此MemberbelongsTo Language,而不是hasMany Language。因此,LanguagehasMany很多Member

请参阅:

  • 简单数据库:

<强>成员信息:

id | name | language_id | int | var_char | int+nullable | // because member can have no lang

语言

id | name | int | var_char |

  • 关联:

(2个档案)

class Member extends Model 
{ 
   public function language() 
   { 
      return $this->belongsTo('App\Language', 'language_id'); 
   } 
}

class Language extends Model 
{ 
   public function members() 
   { 
      return $this->hasMany('App\Member', 'language_id'); 
   } 
}

language_id是关系的外键。在这种情况下,使用或不使用不是主人。

然后,当您想要检索成员语言时,只需使用$member->language;并且,当您要检索具有$language的所有成员时,请使用$language->members

希望这有帮助!

答案 1 :(得分:-1)

you should create one junction model MemberLanguage (obviously this will have a table with member_id and language_id attribute) where you will have member_id and language_id, so the relation in Member model u can have is-

class Member extends Model
 { 
     public function memberLanguage()
      {
         return $this->hasMany('App\MemberLanguage');
      } 
   }

In your MemberLanguage Model, you will have

class MemberLanguage extends Model 
{ 
   public function member() 
   { 
      return $this->belongsTo('App\Member'); 
   } 

   public function language() 
   { 
      return $this->belongsTo('App\Language'); 
   } 
}