Чтобы сделать это в одном запросе, вам нужно добавить в результат запроса новый столбец, который указывает, где находится результат поиска.
Это можно сделать с помощью SQL CASE. Вот общий пример:
$select = "*, CASE";
$select .= " WHEN (title LIKE '%".$search."%' and description LIKE '%".$search."%') THEN 'title-description'";
$select .= " WHEN (title LIKE '%".$search."%') THEN 'title'";
$select .= " WHEN (description LIKE '%".$search."%') THEN 'description'";
$select .= " END as FoundIn";
Model::selectRaw($select)->where('title','LIKE','%'.$search.'%')->orWhere('description','LIKE','%'.$search.'%')->get();
Это добавит к результату новый столбец с именем «FoundIn», который указывает, где находится результат поиска.
Реальный пример:
$search = "Dummy";
$select = "*, CASE";
$select .= " WHEN (topic LIKE '%".$search."%' and subject LIKE '%".$search."%') THEN 'topic-subject'";
$select .= " WHEN (topic LIKE '%".$search."%') THEN 'topic'";
$select .= " WHEN (subject LIKE '%".$search."%') THEN 'subject'";
$select .= " END as FoundIn";
Message::selectRaw($select)->where('topic','LIKE','%'.$search.'%')->orWhere('subject','LIKE','%'.$search.'%')->get();
Результат:
Illuminate\Database\Eloquent\Collection {#2929
all: [
App\Message {#2947
id: 3,
topic: "Dummy Title",
subject: "Dummy Description",
created_at: null,
updated_at: null,
FoundIn: "topic-subject",
},
App\Message {#2940
id: 4,
topic: "Dummy Title",
subject: "Smart Description",
created_at: null,
updated_at: null,
FoundIn: "topic",
},
App\Message {#2941
id: 5,
topic: "Smart Title",
subject: "Dummy Description",
created_at: null,
updated_at: null,
FoundIn: "subject",
},
],
}