我正在尝试找出针对此查询进行过滤的最佳方法,我尝试了一些不同的方法,但无法提出可靠的解决方案。
基本上我们有一般查询,它可以完全满足它的需要,问题是我需要能够在答案表上过滤用户输入。
$profiles = User::with('photos', 'answers')
->where('id', '!=', $user_id)
->where('gender', $gender)
->where('location', $location)
->where('deleted_at', null)
->whereNotExists(function($query) use ($user_id)
{
$query->select(DB::raw('user_id1, user_id2'))
->from('approves')
->whereRaw("users.id = approves.user_id2 AND approves.user_id1 = '$user_id'");
})
->whereNotExists(function($query) use ($user_id)
{
$query->select(DB::raw('user_id1, user_id2'))
->from('likes')
->whereRaw("users.id = likes.user_id2 AND likes.user_id1 = '$user_id'");
})
->take(15)
->get();
它使用了几个用户输入来改变查询,现在用户还可以根据用户的个人资料答案按照各种其他标准进行过滤,这就是我被困住的地方。
答案表的布局是id,user_id,question_id,答案必须是这样的,以便稍后进行扩展。
有没有人知道我如何使用各种其他输入来过滤这一点,例如,如果用户通过question_id'1'过滤并回答'awesome'。值得注意的是,有多个输入不仅仅是一个要比较的输入,只需输入就可以进行比较。
非常感谢任何想法或建议:)
编辑:
id | user_id | question_id | answer
1 | 2 | 1 | dad
2 | 2 | 2 | lion
3 | 2 | 3 | 5
答案 0 :(得分:2)
对于多个可能的问题/答案对,我将定义一个查询范围。现在这不是一个特别有效的查询,其他人可能有更好的答案,但这就是我要做的。
$profiles = User::with('photos', 'answers')
->where('id', '!=', $user_id)
->where('gender', $gender)
->where('location', $location)
->where('deleted_at', null)
->questionAnswer($questionAnswerArray)
->whereNotExists(function($query) use ($user_id)
{
$query->select(DB::raw('user_id1, user_id2'))
->from('approves')
->whereRaw("users.id = approves.user_id2 AND approves.user_id1 = '$user_id'");
})
->whereNotExists(function($query) use ($user_id)
{
$query->select(DB::raw('user_id1, user_id2'))
->from('likes')
->whereRaw("users.id = likes.user_id2 AND likes.user_id1 = '$user_id'");
})
->take(15)
->get();
然后在用户模型中:
public function scopeQuestionAnswer($query, $qaArray)
{
foreach($qaArray as $question => $answer)
{
$query->whereHas('answers', function($query) use ($question, $answer)
{
$query->whereQuestionId($question)
->whereAnswer($answer);
});
}
return $query;
}
这使用了一个带数组的参数数组($ question => $ answer),但应该很容易修改,但是你希望传递它们。
我测试了这种用法并且效果很好,但我再也说不出它的效率。如果你需要按所有正确的问题/答案对进行过滤,这个解决方案不会起作用,你可以在范围函数中使用'orWhereHas'来过滤任何一个。