2016-02-12 87 views
0

我目前有一个网站,我从数据库中抓取歌曲,循环浏览并在页面上显示它们。我现在需要添加一个选项来预览这首歌的8bar样本,我正在努力将foreach放入一个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:

@foreach($beats as $beat) 
<a href="{{$beat->URL}}"><button class="beat-preview">Preview beat</button></a> 
@endforeach 

我缺少的东西非常明显?我只需要将由beat foreach产生的锚点放入歌曲容器div。

澄清: 我有一个ID,一个标题等跟踪表,它与Track ID有关系,Beat表有TrackVariantIds(它们只是8/16/24条的URL)基本上)。

更新:

我整理我的口才车型,现在可以运行下面的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

哪里关系,一个轨道有很多“节拍”?如果是的话,那么只要你正确地建立了他们的关系,那么你把'beat'放在'track'的foreach中就可以了。 – Mysteryos

+0

嘿@Mysteryos - 一首曲目有很多节拍是的,但是我只需要这个页面上的8bar变体(正如我的查询所声明的那样,所以我只能得到8bar)我只是不确定如何做我的循环 – ExohJosh

+0

每个节拍预览都必须有自己的URL。因此,你的'foreach'节拍循环应该是这样开始的:'@foreach($ track-> beats as $ beat)'。否则所有曲目将具有相同的节拍预览。 – Mysteryos

回答

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); 
      }]; 
    ); 
} 

这里就不在一个视图中,刀片或控制器出现问题,我猜。首先是数据组织(DB和Model)的问题。

+0

我认为你对这个模型可能是正确的,但实际上我并没有建立起足够的关系。我会尝试应用这里所做的,我不需要前8个样本,而是所有TrackVariantID为1的节拍:) - 感谢您的帮助! – ExohJosh

+0

我很高兴,如果它帮助:-) 但我必须说,最重要的一步是关系(从我的例子中的第一种方法)。然后你可以在视图中使用它。 如果你需要,你可以在我的例子中使用第二种方法中的任何sql条件。 – Juljan

+0

我对你发给我的例子进行了修改,并得到一个错误:未定义的属性:Illuminate \ Database \ Eloquent \ Collection :: $ getPreviews(View:songselect.blade.php)这是因为我的Eloquent模型关系? – ExohJosh

0

Undefined property: Illuminate\Database\Eloquent\Collection::$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;