laravel查询关系以检查数据是否存在

时间:2019-09-18 13:57:18

标签: php laravel eloquent

我有这样的设置

测验模型

public function scores()
{
    return $this->hasMany('App\Score');
}

得分模型

public function quiz()
{
    return $this->belongsTo('App\Quiz');
}

public function user()
{
    return $this->belongsTo('App\User');
}

用户模型

public function scores()
{
    return $this->hasMany('App\Score');
}

在某些背景下,只有当该用户还没有该测验的分数时,该测验才应由该用户播放,我想做的是,如果用户通过获得测验分数I与测验有关系想停止在查询中返回该测验,这是我的尝试,

$quiz = Quiz::with('questions.answers')
        ->has('scores.user', 2)
        ->whereDate('date_playable', '=', $date)
        ->first();

但是,无论用户是否获得分数,都不会返回任何测验。谁能启发我如何仅返回用户当前没有分数的测验?

2 个答案:

答案 0 :(得分:1)

您当前正在搜索任何用户的分数不超过2的测验。

您需要的是whereDoesntHave

$quiz = Quiz::with('questions.answers')
    ->whereDoesntHave('scores', function ($query) use ($user) {
        $query->where('user_id', $user->id);
    })
    ->whereDate('date_playable', '=', $date)
    ->first();

$user是您要查询的App\User实例。

答案 1 :(得分:0)

可能有多种方法来实现这一目标。我正在考虑在测验和用户之间建立多对多关系,以分数为中间表。

addItem() {
  if(!this.newItem || !this.newItem.name || 
      (this.newItem && !this.newItem.name)) {
    return;
  }

  this.items.push(this.newItem);
  this.newItem = {};
}

然后获得所需的测验:

User
{
    public function quizzes()
    {
        return $this->belongsToMany(Quiz::class, 'scores');
    }
}