Eloquent带来独特的枢轴效果

时间:2014-08-15 12:20:37

标签: laravel many-to-many eloquent

在我的Laravel项目中,我打印出联系人的所有名片。

在联系模式中我有:

    public function organizations()
    {
       return $this->belongsToMany('Organization')->withPivot('ContractStatus')->withTimestamps();
    }

因此,通过这种方式,我可以展示联系人仍在为之工作的所有公司。

在我的联系人概述页面的页脚中,我想打印出该特定搜索查询的所有关联公司徽标。

但是这样的事情:

@foreach($contacts as $key => $value)
    @foreach($value->organizations as $organization)

    @endforeach
@endforeach

一旦搜索结果包含两个同时适用于同一家公司的联系人,就会打印重复的公司徽标。

2 个答案:

答案 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