首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取由laravel中的外键引用标识的行

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

Stack Overflow用户
提问于 2018-12-25 11:01:59
回答 3查看 476关注 0票数 1

我有个音乐流媒体应用。应用程序中有多首歌曲。每个用户可以将一首歌曲“保存”到他们的库中。

所以,基本模型“歌曲”有像song_id,标题,歌曲持续时间,艺术家,专辑。

然后,有一个"usersong“模型,它有很多行。每一行只有一个user_id和一个song_id。当用户登录时,我通过查询他们在该表中的user_id获得他们保存的歌曲列表。但是,我希望获得song_id引用的完整“歌曲”行,而不必同时在歌曲和用户歌曲中存储信息,也不必进行1000个单独的查询。

下面是迁移的“歌曲”(为了简单起见):

代码语言:javascript
复制
  Schema::create('songs', function (Blueprint $table) {
        $table->string('id', 32);
        $table->string('title');
        $table->float('length');
})

下面是"usersong“迁移过程:

代码语言:javascript
复制
 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用户的所有”歌曲“的最佳方法是什么?

代码语言:javascript
复制
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"];
}

理想情况下,我会在另一个脚本中调用它,如下所示:

代码语言:javascript
复制
$songs=UserSong::getByUserId($someuserid);
EN

回答 3

Stack Overflow用户

发布于 2018-12-25 11:59:46

您可以使用作用域和关系:

示例

代码语言:javascript
复制
//scope
public function scopeGetByUserId($query, $someuserid)
{
    return $query->where('user_id', $someuserid);
}

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

使用:

代码语言:javascript
复制
$songs = UserSong::getByUserId($someuserid)->with('userSongs')->get();

Source

票数 2
EN

Stack Overflow用户

发布于 2018-12-25 11:53:59

使用Relationship Existence Query怎么样?

在您的Song模型中,您应该定义与用户的关系。

代码语言:javascript
复制
class Song extends Model
{
    public function users()
    {
        return $this->belongsToMany(User::class)->using(UserSong::class);
    }
}

然后,在您的控制器中,您可以编写:

MyAwesomeController

代码语言:javascript
复制
Song::whereHas('users', function ($query) use ($yourUserId) {
    $query->where('id', $yourUserId);
})->get();

在那里,您将获得链接到您的用户的歌曲集合。

顺便说一下,您的UserSong可能应该扩展Illuminate\Database\Eloquent\Relations\Pivot而不是Model

要获得更多解释,您可以查看Laravel的Many to Many Documentation

票数 1
EN

Stack Overflow用户

发布于 2018-12-25 11:47:00

您可以使用它来以一种简单快速的方式进行连接

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53919022

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档