Ларавел 5.6 |Красноречивое отношение один ко многим - PullRequest
0 голосов
/ 05 июня 2018

Я учу php и laravel.Я делаю грубое испытание для компании, и если я сдаю, меня могут принять за присоединение к команде разработчиков.Одним из требований теста crud является то, что участник (который является основным объектом) может иметь один язык из списка нескольких языковых опций.Очевидно, что один язык может быть связан с несколькими членами.

Так что, если я правильно читаю документы Laravel, внешний ключ между основной моделью (Member) и вторичной моделью (Language) будет установлен автоматически.Мой вопрос заключается в том, как установить отношения логически.

Один из столбцов в моей таблице участников - это столбец 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'); 
   } 
}

Но имеет ли это смысл?Модель Member по существу говорит, что член может иметь несколько языков.Но это не тот случай.У участника может быть только один язык.

Не могли бы вы помочь мне прояснить этот вопрос.

Спасибо

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Ваше отношение неверно.

Поскольку у участника может быть только один язык, Member - это belongsTo Language, а не hasMany Language.Следовательно, Language будет hasMany большим Member с.

См .:

  • Simple db:

членов :

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

Надеюсь, эта помощь!

0 голосов
/ 05 июня 2018

вы должны создать одну модель соединения MemberLanguage (очевидно, это будет таблица с атрибутом member_id и language_id), в которой вы будете иметь member_id и language_id, поэтому отношение в модели Member u может иметь-

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'); 
   } 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...