我有这样的设置
测验模型
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();
但是,无论用户是否获得分数,都不会返回任何测验。谁能启发我如何仅返回用户当前没有分数的测验?
答案 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');
}
}