我目前有一个网站,我从数据库中抓取歌曲,循环并在页面上显示它们。我现在需要添加一个选项来预览这首歌的8bar样本,我正在努力将foreach放在foreach中。我目前在我的网页上显示以下内容:
The markup my loops are producing
我想将节拍放入歌曲容器中,但我有一个循环推出歌曲容器,如下所示:
@foreach($tracks as $track)
<div class="song-container">
<h2>{{$track->Title}}</h2>
<button><a href="/mode-select/fun/freestyle/beatselect/{{$track->id}}?track={{$track->id}}">Select</a></button>
</div>
@endforeach
就在我之前,我有我的节拍:
@foreach($beats as $beat)
<a href="{{$beat->URL}}"><button class="beat-preview">Preview beat</button></a>
@endforeach
我错过了一些非常明显的东西吗?我只需要将由beat foreach产生的锚点放入歌曲容器div中。
澄清: 我有一个带有ID,标题等的轨道表,然后是与轨道ID有关系的Beat表,Beat表有TrackVariantIds(基本上只有8/16/24条URL)。
更新
我对我的Eloquent模型进行了排序,现在可以运行以下foreach:
@foreach($tracks as $track)
<div class="song-container">
<h2>{{$track->Title}}</h2>
@foreach($track->beats as $beat)
{{$beat->URL}}
@endforeach
<a href="{{$track}}"><button class="beat-preview">Preview beat</button></a>
<button><a href="/mode-select/fun/freestyle/beatselect/{{$track->id}}?track={{$track->id}}">Select</a></button>
</div>
@endforeach
//In my Track Model
public function beats() {
return $this->hasMany(\app\Beat::class, 'TrackID', 'id');
}
当我想告诉上面的foreach只采用TrackVariantID为1的那些时,这将返回所有三个节拍。任何想法? :)
提前感谢您的帮助!
答案 0 :(得分:0)
如果我理解正确,你需要这样的东西:
# view file
@foreach($tracks as $oneTrack)
// ...
@foreach($oneTrack->samples as $oneSample)
// ...
@endforeach
@endforeach
# Model file
class Track extends Base
{
// define relationshoip
public function beats() {
return $this->hasMany('Beat');
}
public function samples()
{
return $this->with(
['beats'=>function($query) {
// first 8 samples
return $query->limit(8);
}];
);
}
我认为这在视图,刀片或控制器中不是问题。这是一个数据组织(数据库和模型)的问题。
答案 1 :(得分:0)
未定义的属性: 照亮\数据库\雄辩\收藏:: $ getPreviews
正如错误所说,您正在尝试获取集合上的关系,该集合中的对象(记录)上存在关系。 看来你在DB中有一对多的关系。 所以:
//$tracks->beats - is incorrect.
$beats->first()->beats - should be correct.
# and in views:
foreach ($tracks ad $oneTrack):
$beats = $oneTrack->beats; // is correct.
//$beats->id // is incorrect
$id = $beats->first()->id; // correct
foreach ($beats ad $oneBeat) {
$bid = $oneBeat; // correct
}
endforeach;