我有个音乐流媒体应用。应用程序中有多首歌曲。每个用户可以将一首歌曲“保存”到他们的库中。
所以,基本模型“歌曲”有像song_id,标题,歌曲持续时间,艺术家,专辑。
然后,有一个"usersong“模型,它有很多行。每一行只有一个user_id和一个song_id。当用户登录时,我通过查询他们在该表中的user_id获得他们保存的歌曲列表。但是,我希望获得song_id引用的完整“歌曲”行,而不必同时在歌曲和用户歌曲中存储信息,也不必进行1000个单独的查询。
下面是迁移的“歌曲”(为了简单起见):
Schema::create('songs', function (Blueprint $table) {
$table->string('id', 32);
$table->string('title');
$table->float('length');
})下面是"usersong“迁移过程:
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);发布于 2018-12-25 11:59:46
您可以使用作用域和关系:
示例
//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();发布于 2018-12-25 11:53:59
使用Relationship Existence Query怎么样?
在您的Song模型中,您应该定义与用户的关系。
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的Many to Many Documentation
发布于 2018-12-25 11:47:00
您可以使用它来以一种简单快速的方式进行连接
https://stackoverflow.com/questions/53919022
复制相似问题