2015-10-05 98 views
0

我有一种方法,我将Collection s存储到Collection中。 问题是我得到一个多维Collection,我需要一维Collection,所以我可以在Laravel中使用Collection的可用方法。Laravel转换多维集合

我试过用一个循环来转换我的多维Collection,它工作正常,但我期待的方式使它更清洁一点。

感谢您的帮助和提示。

$activities = new Collection(); 
$last  = new Collection(); 

foreach ($this->members()->get() as $member) 
{ 
    $memberActivity = Activity::where('user_id', $member->id)->get(); 
    $activities->add($memberActivity); 
} 

foreach($activities as $activity) 
{ 
    foreach($activity as $result) 
    { 
     $last->add($result); 
    } 
} 

$result = $result->sortBy('created_at'); 

return $result->last(); 
+0

1.解释你的模型之间的关系。 2.解释你想要改进的是什么,或者你当前的代码有什么问题。 – bernie

回答

0

不知道你在某些方面想达到什么效果,但这看起来像是多对多的关系。

从您的问题看,您似乎有3个表格membersactivitiesmember_activities,而member_activities是您的数据透视表。

所以你应该有2个雄辩的模型:MemberActivity。见http://laravel.com/docs/5.1/eloquent-relationships#many-to-many

class Member extends Model 
{ 
    public function activities() 
    { 
    return $this->belongsToMany(Activity::class, 'member_activities'); 
    } 
} 

class Activity extends Model 
{ 
    public function members() 
    { 
    return $this->belongsToMany(Member::class, 'member_activities'); 
    } 
} 

所以,你可以做类似下面的访问成员的活动:

$memberWithActivities = Member::with('activities')->find($memberId);

$member = Member::all(); 
foreach ($member->activities as $activity) { 
    // 
} 

$activities = Member::find($memberId)->activities()->orderBy('name')->get();

如果您想将活动添加到一个成员,你可以attachdetach - 见http://laravel.com/docs/5.1/eloquent-relationships#inserting-many-to-many-relationships

NB - 我没有检查我的语法,但概念仍然适用。