我有一个音乐流应用程序。应用程序中有多首歌曲。每个用户可以“保存”一首歌曲到他们的图书馆。
所以,基本模型“song”有像song\u id,title,songduration,artist,album这样的内容。
然后,有一个“usersong”模型,它有许多行。每一行只是一个用户id和一首歌曲id。当用户登录时,我通过查询他们的用户id到该表中,得到他们保存的歌曲列表。但是,我想获得song\u id引用的完整“song”行,而不必在songs和usersongs中存储信息,也不必进行1000次单独的查询。
以下是“song”迁移(为简单起见,缩写为):
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”函数在一个查询中返回属于用户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条答案
按热度按时间nhn9ugyo1#
你可以用这个做一个简单和快速的方式加入
https://github.com/themsaid/laravel-model-transformer
myss37ts2#
您可以使用范围和关系:
例子
用途:
来源
uyto3xhc3#
使用关系存在性查询怎么样?
在你的歌曲模型中,你应该定义你和用户的关系。
然后,在控制器中,可以写入:
Myawesome控制器
在那里你将得到与你的用户链接的歌曲集。
顺便说一下,你的
UserSong
也许应该延长Illuminate\Database\Eloquent\Relations\Pivot
而不是Model
.有关进一步的解释,您可以查看laravel的多对多文档