【问题标题】:Laravel query and filteringLaravel 查询和过滤
【发布时间】:2014-10-18 03:17:44
【问题描述】:

我正在尝试找出过滤此查询的最佳方法,我尝试了一些不同的方法,但无法提出可靠的解决方案。

基本上我们有一个很好的通用查询,它完全可以满足它的需要,问题是我需要能够过滤答案表上的用户输入。

$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();

这使用几个用户输入来更改查询,现在用户还可以根据用户的个人资料答案按各种其他条件进行过滤,这正是我遇到的问题。

answers 表的布局是 id、user_id、question_id,answer 必须是这样的,以便以后扩展。

有没有人知道我如何使用各种其他输入进行过滤,例如,如果用户按 question_id '1' 过滤并回答'awesome'。值得注意的是,有多个输入,而不仅仅是一个要比较的输入,而且它们只需要在输入后进行比较。

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

编辑:

id | user_id | question_id | answer
1  | 2       | 1           | dad
2  | 2       | 2           | lion
3  | 2       | 3           | 5

【问题讨论】:

  • 要比较倍数,你应该使用 IN().. 你能提供一些数据给我们看看吗?
  • @JohnRuddell 关于数据我已经编辑了这个问题以包含一个小例子,不确定这是否会有很大帮助,但这是该表的一般布局和数据结构,我想知道是否表本身就是问题之一,如果我正在尝试做的事情甚至可以很好地工作

标签: php mysql laravel laravel-4


【解决方案1】:

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

$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();

然后在 User 模型内部:

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 array($question => $answer) 的参数数组,但应该很容易修改为您希望将它们传入的参数。

我对这种用法进行了测试,效果很好,但我又无法谈论它的效率。如果您需要按所有正确的问题/答案对进行过滤,并不是说此解决方案有效,您可以在范围函数中使用“orWhereHas”来过滤其中的任何一个。

【讨论】:

  • 嘿@akrist 听起来不错,如果这是一个愚蠢的问题,请原谅我,但是 whereQuestionId 和 whereAnswer 将如何工作?这需要对多个参数重复吗?所以如果有问题 id 1,回答 Awesome 和问题 id 2,回答 London,这仍然有效吗?只是想完全理解它,感谢您的输入
  • 嗨,steee,对不起,我稍微误解了您的问题,我没有意识到您希望能够同时过滤多个问题/答案。请查看我的更新答案。
  • 嘿@akrist,它完美地工作了一个小改动,它就在现场,感谢你所说的帮助,我可能需要稍后考虑优化它,但它完全符合我的需要: )
猜你喜欢
  • 2020-08-30
  • 2016-01-09
  • 1970-01-01
  • 1970-01-01
  • 2018-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-16
相关资源
最近更新 更多