【问题标题】:Laravel / Eloquent relationships & querying the databaseLaravel / Eloquent 关系和查询数据库
【发布时间】:2016-05-25 10:31:59
【问题描述】:

我在一个特定的雄辩的查询上遇到了麻烦,我这辈子都想不通。

我正在尝试获取数据库中节拍的 8 小节预览,节拍相关如下:Beat.TrackId->Track.id。歌曲的不同小节存储如下:Beat.TrackVariantID。

我目前有以下代码:

//My controller
$genres = Genre::all();
    $tracks = Track::all();
    $beats = Beat::where('TrackVariantID', 1)->get();


    return view('play.forfun.songselect')->with('genres', $genres)->with('tracks', $tracks)->with('beats', $beats);

我的看法:

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

我可以获取节拍 url,但我不能只获取 Beat.TrackVariantID 为 1 的节拍 url,我似乎得到了所有三个。请参阅:

<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>

任何帮助将不胜感激,我对 Laravel 位还比较陌生。

谢谢

【问题讨论】:

  • 你想达到什么目的? Beat模型和track模型有什么关系?
  • @JimmyObonyoAbor 我想获取曲目变体 id 为 1 的节拍网址,并将它们与曲目一起显示在我的表格中。关系见上文:)

标签: php laravel foreach eloquent


【解决方案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-&gt;beats 时,您将只有与该曲目相关且 TrackVariantID 为 1 的节拍。


附带说明,我不知道这是否是您问题中的拼写错误,但您在 Beat 模型上的 track() 关系与错误模型有关。该函数应该是:

public function track() {
    return $this->belongsTo(\app\Track::class, 'TrackId', 'id');
}

【讨论】:

  • 谢谢!你真的把事情弄清楚了,祝你早上好:D
猜你喜欢
  • 2021-03-21
  • 2013-10-03
  • 2017-07-19
  • 2021-09-25
  • 2015-01-21
  • 2017-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多