我遇到了一个特殊的滔滔不绝的疑问,而且无法解决我的生活问题。
我想在我的数据库中获得一个节拍的8 bar预览,节拍与以下相关:Beat.TrackId-> Track.id。歌曲的不同栏条存储如下:Beat.TrackVariantID。
我目前有以下代码:
@foreach($tracks as $track)
<div class="song-container">
<h2>{{$track->Title}}</h2>
@foreach($track->beats as $beat)
{{$beat->URL}}
@endforeach
<a href=""><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
我的观点:
<?php namespace app;
use Illuminate\Database\Eloquent\Model;
class Beat extends Model {
/************
* Generated *
*************/
protected $table = 'Beat';
protected $fillable = [
'id',
'TrackId',
'TrackVariantID',
'SelectedCount',
'CreditCost',
'URL'
];
public function track() {
return $this->belongsTo(\app\Beat::class, 'TrackId', 'id');
}
}
我的节拍模型:
<div class="song-container">
<h2>Glory</h2>
https://s3-eu-west-1.amazonaws.com/20dollarbeats/8bar/8b_eastcoast.mp3
https://s3-eu-west-1.amazonaws.com/16b_eastcoast.mp3
https://s3-eu-west-1.amazonaws.com/24b_eastcoast.mp3
<a href="">
<button class="beat-preview">Preview beat</button></a>
<button><a href="/mode-select/fun/freestyle/beatselect/3?track=3">Select</a></button>
</div>
我能够获得节拍网址,但我不能只获得Beat.TrackVariantID为1的节拍网址,我似乎得到了所有三个..请参阅:
git bundle create ../reponame.bundle --all
任何帮助都会受到大力赞赏,我对Laravel的比特来说还是比较新的。
谢谢
答案 0 :(得分:1)
首先,由于您循环播放所有曲目并显示相关节拍,因此您需要eager load曲目的节拍。通过消除N + 1问题,这将为您带来性能提升。
急切加载:
$tracks = Track::with('beats')->get();
现在,如果您只需要TrackVariantID为1的节拍,则可以添加此节拍 限制你的渴望加载:
$tracks = Track::with(['beats' => function ($query) {
// $query is the query for the beats related to the tracks
$query->where('TrackVariantID', '=', 1);
})->get();
如果对您的预先加载进行了上述限制,那么当您执行$track->beats
时,您将只有与TrackVariantID为1的该轨道相关的节拍。
在旁注中,我不知道这是否是您问题中的拼写错误,但您track()
模型上的Beat
关系与错误的模型有关。该功能应该是:
public function track() {
return $this->belongsTo(\app\Track::class, 'TrackId', 'id');
}