在我的Laravel项目中,我打印出联系人的所有名片。
在联系模式中我有:
public function organizations()
{
return $this->belongsToMany('Organization')->withPivot('ContractStatus')->withTimestamps();
}
因此,通过这种方式,我可以展示联系人仍在为之工作的所有公司。
在我的联系人概述页面的页脚中,我想打印出该特定搜索查询的所有关联公司徽标。
但是这样的事情:
@foreach($contacts as $key => $value)
@foreach($value->organizations as $organization)
@endforeach
@endforeach
一旦搜索结果包含两个同时适用于同一家公司的联系人,就会打印重复的公司徽标。
答案 0 :(得分:2)
如果您要列出联系人集合的不同集合,请不要使用关系,但whereHas
:
$contactsIds = $contacts->modelKeys();
$organizations = Organization::whereHas('contacts', function ($q) use ($contactsIds) {
$q->whereIn('contacts.id', $contactsIds);
})->get();
另一种方法是这个技巧,以防你实际上需要加载关系:
$organizations = null;
$contacts = Contact::with(['organizations' => function ($q) use (&$organizations) {
$organizations = $q->get();
}])->get();
$organizations = $organizations->unique();
这将通常加载关系,并运行其他查询并将其结果分配给$organizations
。
答案 1 :(得分:0)
在控制器操作中,与组织生成一个新的集合:
$uniqueOrganizations = new Collection();
foreach($contacts as $contact)
$uniqueOrganizations->merge($contact->organizations);
然后将其传递给视图,以显示所有不同的组织
@foreach($uniqueOrganizations as $org)
//show org logo
@endforeach