Laravel 5.6 |雄辩的一对多关系

问题描述 投票:0回答:2

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

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

我的成员表中的一列是language_id列,而languages表由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'); 
   } 
}

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

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

谢谢

php laravel eloquent
2个回答
1
投票

你的关系是对的。

因为一个成员只能有一种语言,所以MemberbelongsTo Language,而不是hasMany Language。因此,LanguagehasMany很多Members。

看到:

  • 简单数据库:

成员:

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
投票

你应该创建一个联结模型MemberLanguage(显然这将有一个带有member_id和language_id属性的表),你将拥有member_id和language_id,因此成员模型中你可以拥有的关系是 -

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

在您的MemberLanguage模型中,您将拥有

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

   public function language() 
   { 
      return $this->belongsTo('App\Language'); 
   } 
}
© www.soinside.com 2019 - 2024. All rights reserved.