Я не получил результат только одним запросом, но надеюсь, что это поможет
$data = Model::raw(function ($collection) use ($request) {
return $collection->aggregate([
['$facet' =>
[
'attr' => [
[
'$match' => [
"attraction.title" => ['$regex' => '.*' . $request->search . '.*'],
],
],
[
'$unwind' => '$attraction'
],
[
'$project' => [
'title' => '$attraction.title',
]
],
[
'$match' => [
"title" => ['$regex' => '.*' . $request->search . '.*'],
],
]
],
'blog' => [
[
'$match' => [
"blog.title" => ['$regex' => '.*' . $request->search . '.*'],
],
],
[
'$unwind' => '$blog'
],
[
'$project' => [
'title' => '$blog.title',
]
],
[
'$match' => [
"title" => ['$regex' => '.*' . $request->search . '.*'],
],
]
]
]
],
]
);
});
$ данные будут выглядеть так:
{
attr:[
{title:...},
{title:...}
],
blog:[
{title:...},
{title:...}
]
}
и используйте iterator_to_array
и foreach
для получения окончательного результата