Multi JOIN Стол в Ларавеле - PullRequest
       7

Multi JOIN Стол в Ларавеле

0 голосов
/ 26 июня 2018

У меня есть 4 таблицы ниже:

трек

+----+-----+----------------+-------+
| ID | TID |     TITLE      | ALBUM |
+----+-----+----------------+-------+
|  1 | AAA | Yesterday      |     1 |
|  2 | BBB | Happy          |     2 |
|  3 | CCC | Gangname Style |     3 |
+----+-----+----------------+-------+

альбом

+----+-----+---------+-------+
| ID | AID |  TITLE  | COVER |
+----+-----+---------+-------+
|  1 | AAA | Album A | 1.jpg |
|  2 | BBB | Album B | 2.jpg |
|  3 | CCC | Album C | 3.jpg |
+----+-----+---------+-------+

track_artist

+----+-----+-----------+
| ID | TID | ARTIST_ID |
+----+-----+-----------+
|  1 |   1 |         1 |
|  2 |   2 |         2 |
|  3 |   3 |         3 |
+----+-----+-----------+

художник

+----+--------+--------+
| ID |  NAME  | AVATAR |
+----+--------+--------+
|  1 | Taylor | 1.JPG  |
|  2 | T-ara  | 2.JPG  |
|  3 | M2M    | 3.JPG  |
+----+--------+--------+

Я хочу получить track.TITLE, album.TITLE и artist.NAME base на track.TID (where TID = $XXX) в таблице 4 выше. Это легко, когда я использую сырой INNER JOIN код MySQL, но я хочу использовать Eloquent ORM в Laravel. Как я могу это сделать? Спасибо.

Я проанализировал:

Один трек belongsTo один Альбом

One track hasMany track_artist

Один track_artist hasOne Artist

Один трек hasMany исполнитель

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Вы можете попробовать это

Таблица должна быть такой, вам нужно 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

0 голосов
/ 26 июня 2018

Во-первых, ваши отношения (на мой взгляд) нуждаются в некоторых изменениях.

  • Один трек принадлежит одному альбому, а в одном альбоме много треков (один ко многим)
  • Один трек имеет одного исполнителя, а один исполнитель имеет несколько треков (один ко многим)
  • В одном альбоме несколько исполнителей, а у одного исполнителя несколько альбомов (от многих ко многим)

Вам понадобится таблица для связи «многие ко многим» с album id и artist id

Это пример с учетом вышеуказанных пунктов


<?php
namespace App;
use Illuminate\Database\Eloquent\Model;

class track extends Model{
    function album(){
        $this->belongsTo(album::class);
    }
    function artist(){
        $this->belongsTo(artist::class);
    }
}

class album extends Model{
    function track(){
        $this->hasMany(track::class);
    }
    function artist(){
        $this->belongsToMany(artist::class, 'my_many_to_many_table');
    }
}

class artist extends Model{
    function track(){
        $this->hasMany(track::class);
    }
    function album(){
        $this->belongsToMany(album::class, 'my_many_to_many_table');
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...