【问题标题】:Completion system with Laravel + VueJSLaravel + VueJS 的补全系统
【发布时间】:2020-12-02 18:52:09
【问题描述】:

我已经尝试了好几个小时来定义我的完成系统的关系,但我失败了。

我有一个表格 Users 和一个表格 Episodes,如果用户完成了一个情节,我想进入我的视图。

我创建了一个包含 user_id 和 episode_id 的“completions”表以及一个名为“completed”的布尔字段

它是多对多关系吗?我想要像 $episode->completed 这样的东西,如果登录用户完成了课程,它会给我 True,但我找不到我的方式......我只想知道如何定义我的关系,而不是一个整体工作完成。

非常感谢!!!!

【问题讨论】:

  • 一般来说,对于一集,用户必须有一个完成标志。而且,我认为您需要将其链接到诸如 user->episode->completed 之类的逻辑,而不是 $episode->completed。完成表可以是连接用户和剧集的枢纽。所以用户和情节之间的关系应该是多对多的。

标签: laravel vue.js relationship progress has-many


【解决方案1】:

我相信你可以告诉 Laravel 使用什么表,也可以查询数据透视列。

//user model
public function episodes(){
    return $this->belongsToMany( 'App\Episode', 'completions', 'user_id', 'episode_id' );
}
public function completedEpisodes(){
    return $this->belongsToMany( 'App\Episode', 'completions', 'user_id', 'episode_id' )
    ->wherePivot('completed','=', true)->get();
}

//episode model
public function users(){
    return $this->belongsToMany( 'App\User', 'completions', 'episode_id', 'user_id' );
}

另一种方法是将您的枢轴创建为 episode_user,laravel 会自动将其检测为枢轴,向该表添加一个完整的布尔值,它只需:

//user model
public function episodes(){
    return $this->belongsToMany('App\Episode');
}
public function completedEpisodes(){
    return $this->belongsToMany('App\Episode')
    ->wherePivot('completed','=', true)->get();
}

//episode model
public function users(){
    return $this->belongsToMany('App\User');
}

查询剧集是否完整:

//可能没试过

//user
    public function hasCompletedEpisode($id){
        return $this->belongsToMany('App\Episode')->wherePivot('episode_id','=', $id)
        ->wherePivot('completed','=', true)->get();
}

//episode
    public function hasCompletedEpisode($id){
    $user_id = Auth::id();
    return $this->belongsToMany('App\User')->wherePivot('user_id','=', $user_id)
    ->wherePivot('completed', true)->get();
}

【讨论】:

  • 我终于成功了 :) 我决定从用户那里获取剧集并确定该剧集是否已在 JS 函数中观看。谢谢!
【解决方案2】:

如果我是你,我会使用custom intermediate table。您可以按如下方式实现:

迁移

Schema::create('users', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->string('name');
    $table->timestamps();
});

Schema::create('episodes', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->string('name');
    $table->timestamps();
});

Schema::create('watches', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->unsignedBigInteger('user_id');
    $table->unsignedBigInteger('epsiode_id');
    $table->boolean('completed');
    $table->timestamps();
});

型号

class User extends Model
{
    protected $guarded = [];
    
    public function watchedEpisodes()
    {
        return $this->hasMany(Episode::class)->using(Watch::class);
    }
    
    public function watches()
    {
        return $this->hasMany(Watch::class);
    }
}

class Episode extends Model
{
    protected $guarded = [];
    
    public function users()
    {
        return $this->hasMany(User::class)->using(Watch::class);
    }
}

class Watch extends \Illuminate\Database\Eloquent\Relations\Pivot
{
    protected $table = 'watches';
    protected $guarded = [];
    
    public static function create(User $user, Episode $episode, bool $completed = false)
    {
        $watch = new self();
        $watch->user_id = $user->id;
        $watch->epsiode_id = $episode->id;
        $watch->completed = $completed;
        $watch->save();
        
        return $watch;
    }
    
    public function user()
    {
        return $this->hasOne(User::class);
    }
    
    public function episode()
    {
        return $this->hasOne(User::class);
    }
}

示例使用

$user = User::create(['name' => 'Big Watcher']);

$episode1 = Episode::create(['name' => 'Episode 1']);
$episode2 = Episode::create(['name' => 'Episode 2']);
$episode3 = Episode::create(['name' => 'Episode 3']);
$episode4 = Episode::create(['name' => 'Episode 4']);

Watch::create($user, $episode1);
Watch::create($user, $episode2);
Watch::create($user, $episode3);

return $user->watchedEpisodes;

【讨论】:

    猜你喜欢
    • 2020-01-27
    • 1970-01-01
    • 2013-11-28
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    • 2018-02-28
    • 2017-06-28
    • 1970-01-01
    相关资源
    最近更新 更多