#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