如何在 Laravel 中使用 LIKE 语句使用查询结果并再次查询

Posted

技术标签:

【中文标题】如何在 Laravel 中使用 LIKE 语句使用查询结果并再次查询【英文标题】:How to use query result and query again using LIKE statement in Laravel 【发布时间】:2019-12-09 21:39:51 【问题描述】:

如果标题中有一些字符,我正在尝试使用问题结果并再次提出问题。 如果我在 condition_question 表中查询,我会得到预期的结果。

public function showQuestions($category)
    
        $myArray = array($category);

        $questions = Question::whereIn('question_id', function ($query) use ($myArray) 
            $query->select('question_id')
                ->from('condition_question')
                ->whereIn('condition_id', $myArray);
        )->orderBy('question_id', 'desc')->paginate(20);

        return QuestionLiteResource::collection($questions);

问题:我现在如何使用 $questions 结果并使用 LIKE 语句再次查询。到目前为止,我尝试了很多东西,例如像这样,但是因为我收到错误而缺少一些东西:

public function showQuestions($category, $queryQuestion)
    
        $myArray = array($category);

        $chary = $queryQuestion;

        $questions = Question::whereIn('question_id', function ($query) use ($myArray) 
            $query->select('question_id')
                ->from('condition_question')
                ->whereIn('condition_id', $myArray);
        )->get();

        $results = $questions->where('question_title', 'LIKE', "%$chary%")->get();

        return QuestionLiteResource::collection($results->values());

我知道这不是我最好的,但需要一些帮助......最后有分页结果也很酷。 那么,如何从标题有字符的问题表中获取问题集合。任何帮助都将受到欢迎!

【问题讨论】:

【参考方案1】:

您可能知道,一旦您调用 get() 函数,您就会得到结果并且无法进一步查询。也许这会起作用:

public function showQuestions($category, $queryQuestion)
    
        $myArray = array($category);

        $chary = $queryQuestion;

        $questions = Question::whereIn('question_id', function ($query) use ($myArray) 
            $query->select('question_id')
                ->from('condition_question')
                ->whereIn('condition_id', $myArray);
        )
        ->where('question_title', 'LIKE', "%$chary%")
        ->get();

        return QuestionLiteResource::collection($questions);

【讨论】:

谢谢,它有效!我只是在末尾添加了 get() 而不是 orderBy('question_id', 'desc')->paginate(20);通过这种方式,我得到了我的分页和顺序。谢谢。【参考方案2】:

由于您在问题查询中调用了get(),因此您得到的结果为Laravel Collection

要过滤集合,您可以使用filter() 函数。

示例代码

$results = $questions->filter(function($question) use ($chary) 
    return Str::contains($question->question_title, $chary);
);

【讨论】:

嗨 Tharaka。很好的答案,它确实返回对象数组。如何实现分页和orderBy? 没关系,我通过结合 Kevin Bui 的答案和 get() 最后添加 orderBy('question_id', 'desc')->paginate(20);谢谢!【参考方案3】:
i think you can use join():

        public function showQuestions($category, $queryQuestion)
        
            $myArray = array($category);
            $chary = $queryQuestion;

            $query = Question::getModel()->newQuery();
            $questions = $query
                 ->join('condition_question', function (Builder $join) use ($myArray) 
                   $join->on('questions.question_id', '=', 'condition_question.question_id');
                   $join->whereIn('condition_question.condition_id', $myArray);
                 ) 
                 ->where('questions.question_title', 'like', $chary)
                 ->orderBy('questions.question_id', 'desc')
                 ->paginate(20)

            return QuestionLiteResource::collection($questions);
        

【讨论】:

以上是关于如何在 Laravel 中使用 LIKE 语句使用查询结果并再次查询的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel 中使用“LIKE”? [复制]

如何使用 Laravel 在 LIKE 搜索中使用 ORM 从两个表中获取数据

在 Laravel 中使用“LIKE”查询将数组转换为字符串

如何使用 WHERE LIKE (或等效)搜索 Laravel 集合

Spark Scala:如何在 LIKE 语句中使用通配符作为文字

如何在 laravel 的 eloquent 中转换表列数据?