Вы можете попробовать это
Таблица должна быть такой, вам нужно 4 таблицы
albums(id, title, cover)
artist(id, name, avatar)
tracks(id, album_id, title)
track_artists (id, artist_id, track_id) ManyToMany with tracks
Модель
class Album extends Model{
function tracks(){
$this->hasMany(Track::class);
}
}
class Artist extends Model{
function tracks(){
$this->belongsToMany(Track::class, 'track_artists'); //here track_artists table is as pivot table
}
}
class Track extends Model{
function album(){
$this->belongsTo(Album::class);
}
function artist(){
$this->belongsToMany(Artist::class, 'track_artists'); //here track_artists table is as pivot table
}
}
Получить данные
$track = Track::with('album','artists')->find($trackId);
echo $track->title." - ". $track->album->title;
//now print all artist of this track
foreach($track->artists as $artist){
echo $artist->name;
}
Примечание: Вам не нужно создавать модель для track_artists
, потому что это сводная таблица для tracks
и artists
таблиц. Вы можете вставить и обновить в сводной таблице, используя Track
или Artist
laravel eloquent модель. Хотя, если вы хотите, вы можете создать его с расширением Pivot
.
Сохранить данные в сводной таблице
$track = Track::find(1);
$artist = Artist::create(['name' => 'Katy Perry', 'avatar' => 'Katy_Perry.jpg']);
$track->artists()->save($artist); //this save track and artist relation in track_artists pivot table
Подробнее https://laravel.com/docs/5.6/eloquent-relationships#many-to-many