Php Laravel查询和过滤

Php Laravel查询和过滤,php,mysql,laravel,laravel-4,Php,Mysql,Laravel,Laravel 4,我正在尝试为这个查询找出最佳的过滤方法,我尝试了一些不同的方法,但没有找到一个可靠的解决方案 基本上,我们有一个通用的查询,它可以很好地做它需要做的事情,问题是我需要能够根据用户在答案表上的输入进行过滤 $profiles = User::with('photos', 'answers') ->where('id', '!=', $user_id) ->where('gender', $gender) ->where('locat

我正在尝试为这个查询找出最佳的过滤方法,我尝试了一些不同的方法,但没有找到一个可靠的解决方案

基本上,我们有一个通用的查询,它可以很好地做它需要做的事情,问题是我需要能够根据用户在答案表上的输入进行过滤

$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\u id,question\u id,answer。它必须是这样的,以便以后进行扩展

有没有人知道我如何通过各种其他输入进行过滤,例如,如果一个用户通过问题_id“1”进行过滤,然后回答“awesome”。值得注意的是,有多个输入,而不仅仅是一个要比较的输入,而且只需要在输入时进行比较

非常感谢您的任何想法或建议:)

编辑:


对于多个可能的问题/答案对,我将定义一个查询范围。现在这不是一个特别有效的查询,其他人可能会有更好的答案,但我会这样做

$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;
}
这使用了一个带有where数组($question=>$answer)的参数数组,但是应该很容易修改为您希望传递它们的方式


我测试了这个用法,它运行得很好,但我还是不能说它的效率。如果您需要按所有正确的问题/答案对进行筛选,则此解决方案不起作用,您可以在作用域函数中使用“orWhereHas”对其中任何一个进行筛选。

要比较应在()中使用的倍数,请使用。。你能提供一些数据给我们看吗?@JohnRuddell关于数据我编辑了这个问题,加入了一个小例子,不确定这是否会有很大帮助,但这是该表的总体布局和数据结构,我想知道桌子本身是否是问题之一,我正在尝试做的事情是否有效嘿@akrist听起来不错,如果这是一个愚蠢的问题,请原谅,但是whereQuestionId和Wherenswer如何工作?对于多个参数,是否需要重复此操作?所以,如果有问题id 1,回答真棒,问题id 2,回答伦敦,这仍然有效吗?只是想完全理解它真的,谢谢inputHi steee,很抱歉我稍微误解了你的问题,我没有意识到你想同时过滤多个问题/答案。请看我的最新答案。嘿@akrist,它工作得很好,只是做了一个小小的改动,很到位,谢谢你的帮助,就像你说的那样,我以后可能需要对它进行优化,但它正是我需要它做的:)
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;
}