У меня есть приложение для потоковой передачи музыки.В приложении несколько песен.Каждый пользователь может «сохранить» песню в своей библиотеке.
Итак, базовая модель "song" имеет такие вещи, как song_id, title, songduration, artist, album.
Затем есть модель userong, в которой много строк.Каждая строка - это просто user_id и song_id.Когда пользователь входит в систему, я получаю список песен, которые они сохранили, запрашивая их user_id в этой таблице.Но я хотел бы получить полную строку «song», на которую ссылается song_id, без необходимости хранить информацию как в песнях, так и в userongs, и без необходимости делать 1000 отдельных запросов.
Вот эта «песня»"миграция (сокращена для простоты):
Schema::create('songs', function (Blueprint $table) {
$table->string('id', 32);
$table->string('title');
$table->float('length');
})
Вот миграция" userong ":
Schema::create('usersongs', function (Blueprint $table) {
$table->integer('user_id')->unsigned(); // a koel reference
$table->string('song_id', 32);
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->foreign('song_id')->references('id')->on('songs')->onDelete('cascade');
});
Вот модель UserSong для приведенной выше схемы.Каков наилучший способ заставить функцию «getByUserId» возвращать все «песни», принадлежащие пользователю с user_id, в одном запросе?
class UserSong extends Model
{
protected $guarded = [];
protected $table="usersongs";
public function getByUserId($user_id){
$this->where("user_id",$user_id)->get();
/// how do I get the song rows automatically in this function?
}
protected $fillable=["user_id","song_id"];
}
В идеале я бы назвал его в другом сценарии, например:
$songs=UserSong::getByUserId($someuserid);