Получение строки, идентифицированной ссылкой внешнего ключа в laravel - PullRequest
0 голосов
/ 25 декабря 2018

У меня есть приложение для потоковой передачи музыки.В приложении несколько песен.Каждый пользователь может «сохранить» песню в своей библиотеке.

Итак, базовая модель "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);

Ответы [ 3 ]

0 голосов
/ 25 декабря 2018

Как насчет использования Запроса о существовании отношений ?

В вашей модели Song вы должны определить свои отношения с User .

class Song extends Model
{
    public function users()
    {
        return $this->belongsToMany(User::class)->using(UserSong::class);
    }
}

Затем в вашем контроллере вы можете написать:

MyAwesomeController

Song::whereHas('users', function ($query) use ($yourUserId) {
    $query->where('id', $yourUserId);
})->get();

Там вы получите коллекцию связанных песендля вашего пользователя.


Кстати, ваш UserSong может быть увеличен Illuminate\Database\Eloquent\Relations\Pivot вместо Model.

Для более подробных объяснений вы можете взглянуть на Laravel's Документация "многие ко многим"

0 голосов
/ 25 декабря 2018

Вы можете использовать область и отношения:

Пример

//scope
public function scopeGetByUserId($query, $someuserid)
{
    return $query->where('user_id', $someuserid);
}

//relationship
public function userSongs()
{
    return $this->hasMany('App\Song', 'song_id');
}

Использование:

$songs = UserSong::getByUserId($someuserid)->with('userSongs')->get();

Источник

0 голосов
/ 25 декабря 2018

Вы можете использовать это для быстрого и простого присоединения

https://github.com/themsaid/laravel-model-transformer

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...