У меня есть модель Community, и у каждого из этих сообществ может быть badges. Мой вопрос в том, как бы я назначал значки сообществу, а затем отображал их в представлении. Я изучил отношения Laravel, но мне не удалось заставить их работать, хотя сценарий соответствует их цели.
У меня есть 3 таблицы:
communities - Таблица заполнена сообществами, зарегистрированными в приложении.
community_badges — содержит столбцы id, community_id и badge_type
badge_types - содержит информацию о каждом значке, например, его имя, описание и т. д.
community_id в таблице community_badges относится к id в таблице badge_types. Когда я получаю значки с помощью красноречивого и отображаю их в представлении, не имеет значения, какие сообщества имеют значки, все сообщества имеют одинаковые значки.
Как мне назначить badges конкретным communities и отобразить их в представлении?
(Текущий код в представлении:)
public function index()
{
$communitiesIds = CommunityMemberList::where('user_id', Auth::user()->id)->pluck('community_id');
$communities = Community::whereIn('id', $communitiesIds)->get();
$badgeTypeId = CommunityBadge::where('community_id', $communitiesIds)->pluck('badge_type');
$badges = BadgeType::whereIn('id', $badgeTypeId)->get();
return view('home', compact('communities', 'badges'));
}
Заранее спасибо :)






Сделайте свою структуру БД такой
communities:id, ...
badge_types:id, ...
community_badges:community_id,badge_type_id, ...
Определите свои отношения
В модели сообщества определите
public function badge_types()
{
return $this->belongsToMany(BadgeTypes::class, 'community_badges');
// or when you not change db structure
//return $this->belongsToMany(BadgeTypes::class, 'community_badges', 'community_id','badge_type');
}
Применение
$communities = Community::with('badge_types')->get();
foreach($communities as $community) {
$communityBadges = $community->badge_types;
// other logic here
}
Редактировать:
public function index()
{
$communitiesIds = CommunityMemberList::where('user_id', Auth::user()->id)->pluck('community_id');
$communities = Community::whereIn('id', $communitiesIds)->with('badge_types')->get();
return view('home', compact('communities'));
}
В представлении кода, подобного этому
@foreach($communities as $community)
@php($communityBadges = $community->badge_types)
@foreach($communityBadges as $badgeType)
{{ $badgeType->id }}
// other logic here
@endforeach
@endforeach
Получение этой ошибки: Property [badge_types] does not exist on this collection instance.
Ах, я оставил там dd(), который не возвращал переменную. Ошибка новичка. Спасибо, теперь работает :)
Ok. Поляна тебе в помощь
Можете ли вы показать нам ваши отношения на ваших моделях?