Laravel从另一个表中获取值

时间:2015-08-03 19:36:41

标签: string laravel foreach

我在控制器中使用以下代码:

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

不幸的是,我无法弄清楚哪里可能出错......

1 个答案:

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