【问题标题】:Foreach looping with blade from controller data从控制器数据中使用刀片的 Foreach 循环
【发布时间】:2016-05-23 11:41:22
【问题描述】:

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

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

我是否遗漏了一些非常明显的东西?我只需要将节拍 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 的节拍时,这会返回所有三个节拍。有什么想法吗? :)

提前感谢您的帮助!

【问题讨论】:

  • 关系方面,一首曲目有很多“节拍”?如果是,那么您可以将beat foreach 放在track 的foreach 中,只要您正确设置它们的关系即可。
  • 嘿@Mysteryos - 一首曲目有很多节拍,是的,但是我只需要此页面上的 8bar 变体(无论如何我的查询已声明,所以我只得到 8bar 的)我只是不确定如何做我的循环
  • 每个节拍预览都必须有自己的 URL。因此,您的foreach 节拍循环应该这样开始:@foreach($track-&gt;beats as $beat)。否则所有曲目将具有相同的节拍预览。
  • 也许你需要在 foreach 曲目中使用你的节拍 foreach 并像 foreach($track->getBeats() as $beat) 一样改变你的节拍。
  • 如果节拍在曲目中,您应该有一些现场曲目->节拍,您应该能够从那里开始工作。

标签: php laravel foreach blade


【解决方案1】:

如果我理解正确,你需要这样的东西:

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

我想这在视图、刀片或控制器中都不是问题。首先是数据组织(数据库和模型)的问题。

【讨论】:

  • 我认为你对模特的看法可能是对的,我实际上并没有把关系建立得足够尴尬。我将尝试应用这里所做的,我不需要前 8 个样本,而是所有 TrackVariantID 为 1 的节拍 :) - 感谢您的帮助!
  • 我很高兴,如果它有帮助:-) 但我不得不说,最重要的一步是关系(我的例子中的第一个方法)。然后你可以在视图中使用它。如果需要,您可以在我的示例中的第二种方法中使用任何 sql 条件。
  • 我已经修改了您发送给我的示例,但出现错误:未定义属性:Illuminate\Database\Eloquent\Collection::$getPreviews (View: songselect.blade.php) 这是因为我的 Eloquent 模型关系?
【解决方案2】:

未定义的属性: Illuminate\Database\Eloquent\Collection::$getPreviews

正如错误所说,您正在尝试获取集合上的关系,该关系存在于该集合中的对象(记录)上。 看来您在数据库中有一对多的关系。 所以:

//$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;

【讨论】:

    猜你喜欢
    • 2017-12-02
    • 2018-04-04
    • 2016-06-29
    • 2020-04-12
    • 2017-11-13
    • 2021-03-10
    • 1970-01-01
    • 2017-05-29
    • 2014-08-08
    相关资源
    最近更新 更多