我在控制器中使用以下代码:
public function show($id)
{
$playlist = Playlists::find($id); //Grab the playlist data from the database
$tracks = explode(', ',$playlist->tracks); //Seperate the track id's (remove the comma) -> In database it is stored like this: 54, 23, 45, 23, 23 etc..
$showTracks = array(); //Create a new array
foreach ($tracks as $track)
{
$showTracks[] = Tracks::where('id', '=', $track); //Grab the actual names of the tracks
}
return View::make('playlists/show')
->with('tracks', $showTracks);
}
我所拥有的是以下内容。一个名为“Tracks”的数据库表和一个名为“Playlists”的表。所有曲目都有一个名为“name”的字段,其中列出了歌曲的全名。在我的播放列表表格中,我有一个名为“轨道”的字段,其中属于该播放列表的所有轨道都使用轨道的id存储,逗号分隔,如下所示:
23,45,22,12,543 ..等等
现在我要做的是,当我去mysite.com/playlists/1(调用show函数)时 - 我希望在我的刀片视图中使用foreach按名称显示所有曲目:
@foreach ($tracks as $track)
{{ $track }}
@endforeach
但是使用我当前的功能,我收到以下错误:
类Illuminate \ Database \ Eloquent \ Builder的对象无法转换为字符串
如果我这样做:
@foreach ($tracks as $track)
{{ $track->name }}
@endforeach
显示此错误:
未定义属性:Illuminate \ Database \ Eloquent \ Builder :: $ name
不幸的是,我无法弄清楚哪里可能出错......
答案 0 :(得分:1)
$showTracks[] = Tracks::where('id', '=', $track)->first();
您需要通过调用first()来实际执行查询,first()将从该查询中检索第一个结果。由于你是通过id查询的,所以应该只有一个。或者,您可以使用Tracks :: find($ track)并获得相同的结果。
也就是说,michael在评论中是正确的,这不是设置架构的最佳方式。首选是使用数据透视表,然后设置模型关系,这将允许您编写如下代码:
$playlist = Playlists::find($id);
return View::make('playlists/show')->with('playlist', $playlist);
然后在你看来:
@foreach($playlist->tracks as $track)
{{ $track->name }}
@endforeach