Laravel: Метод вложенных отношений

#laravel #eloquent

Вопрос:

У меня есть следующие модели:

Пользователи

  • ID
  • Имя

члены организации_

  • ID
  • organization_id (FK для организаций)
  • идентификатор пользователя (FK для пользователей)
  • unqiue(идентификатор организации, идентификатор пользователя)

организации

  • ID
  • Имя

Пользователь может быть членом многих организаций.

Мои модели написаны следующим образом

 class User extends Model {
    public function organisationMembers(): HasMany
    {
        return $this->hasMany(OrganisationMember::class);
    }
  
    public function organisations()
    {
        // TODO: how do I do this one
    }
}
 
 class OrganisationMember extends Model {
    public function organisation(): BelongsTo
    {
        return $this->belongsTo(Organisation::class);
    }

    public function user(): BelongsTo
    {
        return $this->belongsTo(User::class);
    }
}
 
 class Organisation extends Model {
    public function organisationMembers(): HasMany
    {
        return $this->hasMany(organisationMember::class);
    }
}
 

Как я могу написать метод отношений в User модели для organisations ?

Комментарии:

1. Я действительно в замешательстве, у вас есть many-to-many отношение , а не а one-to-many , organisation_members это отношение между user и organisation , поэтому оно должно быть названо organisation_user , и вместо hasMany этого вы должны использовать belongsToMany , чтобы пользователи могли иметь несколько организаций, а организации могли иметь несколько пользователей… Прочитайте эту часть документации , чтобы вы поняли, что я пытаюсь объяснить.

2. обратите внимание, что belongsToMany в качестве второго аргумента используется имя промежуточной таблицы, поэтому нет необходимости переименовывать таблицу, хотя переименование, как предложил @matias, может быть лучшей практикой Laravel.

3. @user3532758 да, я игнорирую второй параметр, так как он не соответствует стандартам laravel

4. Вы не создаете отношения, вы уже создаете отношения «многие ко многим» между Пользователем и Организацией. Нет необходимости устанавливать отношения с общественными организациями.

5. @Collin Итак, как бы я получил все организации пользователей?

Ответ №1:

Благодаря комментарию @matiaslauriti ответ таков:

 class User extends Model {
    public function organisationMembers(): HasMany
    {
        return $this->hasMany(OrganisationMember::class);
    }
  
    public function organisations()
    {
        return $this->belongsToMany(Organisation::class, 'organisation_members');
    }
}
 

Комментарии:

1. User может быть много OrganisationMember , а OrganisationMember может быть один Organisation . Поэтому отношения между User и Organisation являются отношениями «многие ко многим», поскольку пользователь может быть членом многих организаций.

2. Это в основном тот же пример, что и документы Laravel, которые я не осознавал: laravel.com/docs/8.x/eloquent-relationships#many-to-many

3. Я пробовал HasOneThrough и HasManyThrough , но я считаю, что структура этих моделей немного отличается: laravel.com/docs/8.x/eloquent-relationships#has-many-through