在laravel中获取外键引用标识的行

lyr7nygr  于 2021-06-15  发布在  Mysql
关注(0)|答案(3)|浏览(364)

我有一个音乐流应用程序。应用程序中有多首歌曲。每个用户可以“保存”一首歌曲到他们的图书馆。
所以,基本模型“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);
nhn9ugyo

nhn9ugyo1#

你可以用这个做一个简单和快速的方式加入
https://github.com/themsaid/laravel-model-transformer

myss37ts

myss37ts2#

您可以使用范围和关系:
例子

//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();

来源

uyto3xhc

uyto3xhc3#

使用关系存在性查询怎么样?
在你的歌曲模型中,你应该定义你和用户的关系。

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

然后,在控制器中,可以写入:
Myawesome控制器

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

在那里你将得到与你的用户链接的歌曲集。
顺便说一下,你的 UserSong 也许应该延长 Illuminate\Database\Eloquent\Relations\Pivot 而不是 Model .
有关进一步的解释,您可以查看laravel的多对多文档

相关问题