Laravel / Eloquent的关系&查询数据库

时间:2016-02-14 15:52:19

标签: php laravel foreach eloquent

我遇到了一个特殊的滔滔不绝的疑问,而且无法解决我的生活问题。

我想在我的数据库中获得一个节拍的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的比特来说还是比较新的。

谢谢

1 个答案:

答案 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');
}