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
$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.