2015-08-03 7 views
0

Я использую следующий код в моем контроллере:значение грейферные Laravel из другой таблицы

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

Что у меня есть следующий. Таблица базы данных «Треки» и таблица под названием «Плейлисты». На всех дорожках есть поле под названием «имя», в котором указано полное имя песни. В моей таблице плейлистов у меня есть поле под названием «дорожки», в котором все дорожки, принадлежащие этому списку воспроизведения, хранятся с использованием идентификаторов треков, разделенных запятыми, например:

23, 45, 22, 12, 543. . и т. д.

Теперь, что я хочу сделать, когда я иду на mysite.com/playlists/1 (чтобы вызвать функцию show) - я хочу, чтобы все дорожки отображались по их имени, используя foreach, на мой взгляд лезвия:

@foreach ($tracks as $track) 
{{ $track }} 
@endforeach 

Но с моей текущей функции я получаю следующее сообщение об ошибке:

Объект класса Осветите \ Database \ красноречивый \ Builder не может быть преобразован в строку

И если я это сделать:

@foreach ($tracks as $track) 
{{ $track->name }} 
@endforeach 

Он показывает эту ошибку:

Не определено свойство: Осветить \ Database \ Красноречивым \ Builder :: $ имя

к сожалению, я не мог понять, где я мог бы пойти не так ..

+0

Try $ трек [ 'name'] – MstfAsan

+1

Вы должны изменить схему своей базы данных. Наличие разделенных запятыми значений в базе данных почти всегда является плохой идеей. Вы могли бы очень легко загрузить этот запрос, если бы у вас была правильная структура таблицы. – baao

ответ

1
$showTracks[] = Tracks::where('id', '=', $track)->first(); 

Необходимо выполнить запрос, вызвав first(), который будет извлекать первый результат из этого запроса. Поскольку вы запрашиваете идентификатор, должен быть только один. Кроме того, вы можете использовать Tracks :: find ($ track) и получить те же результаты.

Это говорит о том, что майкл правильно комментирует, что это не лучший способ настроить вашу схему. Предпочтительным будет использовать сводную таблицу, а затем создать модель отношений, которая позволит вам писать код, как это:

$playlist = Playlists::find($id); 
return View::make('playlists/show')->with('playlist', $playlist); 

, а затем в ваш взгляд:

@foreach($playlist->tracks as $track) 
{{ $track->name }} 
@endforeach 
+0

Хотя я знаю о взаимоотношениях с моделью (я даже их уже настроил), я не знаю, как должна выглядеть моя фактическая структура базы данных и как я буду связывать треки с моими плейлистами? – Hardist

+1

Это немного помогает объяснить. В принципе, у вас будет три таблицы. плейлисты (id, name), треки (id, name) и playlist_tracks (playlist_id, track_id). При добавлении трека в список воспроизведения вы должны создать новую строку в таблице playlist_tracks с соответствующими playlist_id и track_id. Поэтому каждая песня в списке воспроизведения будет новой строкой в ​​таблице playlist_tracks. Проверьте их для получения дополнительной справки: http://laravel.com/docs/5.1/eloquent-relationships#many-to-many http://laravel.com/docs/5.1/eloquent-relationships#inserting-many- to-many-relationship –

+1

Ах, ладно, спасибо за информацию.Это на самом деле то, чего я пытался избежать (у меня было это), и я хотел, чтобы это было просто для меня самого (это для моего личного сайта только для меня один :)) – Hardist

Смежные вопросы