【问题标题】:Laravel 5.6 | Eloquent One to Many RelationshipLaravel 5.6 |雄辩的一对多关系
【发布时间】:2018-11-14 11:24:13
【问题描述】:

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

所以如果我正确阅读 laravel 文档,主模型(成员)和辅助模型(语言)之间的外键将自动设置。我的问题是如何在逻辑上建立关系。

我的成员表中的一列是 language_id 列,语言表由 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 种语言。

你能帮我澄清一下这个问题吗?

谢谢

【问题讨论】:

  • 不应该LanguagehasMany 的成员吗?然后一个成员应该只有一种语言
  • ^ 你已经扭转了关系。语言有很多成员,一个成员属于一种语言
  • 应该转过来,然后你得到正确的关系
  • 也许公司正在寻找您是否可以自己解决逻辑而不是依赖论坛。正如其他人已经说过的那样,您的方法不对,应该是 User 模型上的 belongsTo 。
  • 没错,我的关系搞错了。 TonySawlwin,我的理解是,尤其是在学习编码时,依靠论坛是件好事。它证明你可以去解决问题并通过论坛学习。无论如何,我们的开发人员对此持开放态度。感谢您的回复

标签: php laravel eloquent


【解决方案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 是关系的外键。在这种情况下,使用与否不是master。

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

希望对您有所帮助!

【讨论】:

  • 这是正确的。但是,正如您所提到的,我不必像 laravel 在后台那样指定 fk。
  • Laravel 会自动为你添加 fk,以防 fk 格式为 strtolower(<ModelName>).'_id'。如果使用其他格式设置 fk 名称,则需要在 Eloquent 关系中手动设置 fk。例如:如果您使用lang_id 而不是language_id,则必须将$this->belongsTo('App\Language', 'lang_id'); 设置为需要lang_id
【解决方案2】:

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

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'); 
   } 
}

【讨论】:

    猜你喜欢
    • 2012-10-08
    • 2018-10-27
    • 2015-07-01
    • 2019-03-10
    • 2018-11-07
    • 2016-11-03
    • 2013-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多