I’m not sure whether this has another method. But this is what I thought of it
$word1 = 'word1';
$word2 = 'word2';
$word3 = 'word3';
$all = DB::table('posts')
->where('meta_name', 'like', "%{$word1}%")
->where('meta_name', 'like', "%{$word2}%")
->where('meta_name', 'like', "%{$word3}%")
->orWhere(function($query) use ($word1, $word2, $word3) {
$query->where('meta_description', 'like', "%{$word1}%")
->where('meta_description', 'like', "%{$word2}%")
->where('meta_description', 'like', "%{$word3}%");
});
$twoWords = DB::table('posts')
->where('meta_name', 'like', "%{$word1}%")
->where('meta_name', 'like', "%{$word2}%")
->orWhere(function($query) use ($word1, $word2) {
$query->where('meta_description', 'like', "%{$word1}%")
->where('meta_description', 'like', "%{$word2}%");
})
->whereNotIn('id', $all->pluck('id'));
$oneWord = DB::table('posts')
->where('meta_name', 'like', "%{$word1}%")
->orWhere('meta_description', 'like', "%{$word1}%")
->whereNotIn('id', $all->pluck('id'))
->whereNotIn('id', $twoWords->pluck('id'));
and finally union
all
$posts = $all->union($twoWords)->union($oneWord)->get(); // check this first
# or
$posts = $all->union($twoWords)->union($oneWord)->skip($start)->take($this->rowperpage)->get();