2017-05-24 95 views
1

我有2个表,一个是杂志,另一个是问题。我已经建立了自己的关系是这样的:Laravel通过关系表获得收藏

杂志模特:

public function issues() 
{ 
    return $this->hasMany('App\Issue')->orderBy('date', 'desc'); 
} 

发行模式:

public function magazine() 
{ 
    return $this->belongsTo('App\Magazine'); 
} 

我有一个查询在那里我得到一列有序的杂志,然后在foreach循环我得到每本杂志的第一期,并将其存储在阵列中:

$magazines = Magazine::with('issues')->orderBy('order')->get(); 

    foreach ($magazines as $magazine) 
    { 
     $issues[] = $magazine->issues()->first(); 
     $images[] = $magazine->issues()->first()->image; 
    } 

但是, d喜欢做一个集合而不是一个数组。我不知道我该怎么做这种查询,或者有没有办法以某种方式将值存储到foreach循环中的集合?

+0

'杂志'表中已有多少行? –

回答

1

有几种方法可以做到这一点。

通过执行以下操作,可以将数组转换为集合。

$issuesCollection = collect($issues); 
$imagesCollection = collect($images); 

你也可以初始化一个空的集合,然后使用push()方法追加项目给它。检查documentation

0

只需使用map功能:通过收集

$magazines = Magazine::with('issues')->orderBy('order')->get(); 

$firstIssues = $magazines->map(function($magazine) { 
    return $magazine->issues->first(); 
}); 

$images = $firstIssues->map(function($issue) { 
    return $issue->image; 
}); 

地图迭代方法并通过每个值 给定的回调。回调是免费修改该项目,并 返回它,从而形成一个新的收集修改项目

+1

你应该把'$ magazine-> issues() - > first();'改成'$ magazine-> issues-> first();'。这些问题已经急于加载第一个查询,但是您正在为每个杂志使用另一个查询来重新加载地图回调中的第一个问题。这是多余的,效率低下的。 – fubar

+1

你的第二张地图也是错误的。您需要映射'$ firstIssues'集合,而不是'$ magazines'集合来获取图像。 – fubar

+0

双倍好抓,谢谢! –