laraveleloquent

How to programmatically add where clauses to query?


I have this query..

        $docs = DB::table('docs_text')
           ->select(['documents.id', 'documents.filename', 'documents.extension', 'documents.description', 'documents.created_at', 'documents.url'])
           ->join('documents as documents', 'docs_text.doc_id' ,"=", 'documents.id' )
           ->where('doc_text','like',"%$firstKeyword%")
           ->groupBy(['documents.id', 'documents.filename', 'documents.extension', 'documents.description', 'documents.created_at', 'documents.url'])
           ->orderBy("created_at")
           ->get();

What I need to do is if I have more keywords I want to programmatically add

andWhere('doc_text','like',"%$keywords[$idx]%");

Not sure how to do this. Do i have to create a raw sql?

Thanks for any help


Solution

  • $keywords = ['keyword1', 'keyword2', 'keyword3']; // Your array of keywords
    
    $docs = DB::table('docs_text')
        ->select(['documents.id', 'documents.filename', 'documents.extension', 'documents.description', 'documents.created_at', 'documents.url'])
        ->join('documents as documents', 'docs_text.doc_id', "=", 'documents.id')
        ->where(function ($query) use ($keywords) {
            foreach ($keywords as $keyword) {
                $query->orWhere('doc_text', 'like', "%{$keyword}%");
            }
        })
        ->groupBy(['documents.id', 'documents.filename', 'documents.extension', 'documents.description', 'documents.created_at', 'documents.url'])
        ->orderBy("created_at")
        ->get();
    

    I've changed the code by swapping out where with orWhere inside the loop. This way, the documents will be matched if they contain any of the keywords.