laravel объединить все массивы в один - PullRequest
1 голос
/ 04 февраля 2020

У меня есть функция поиска, которая выполняет поиск в нескольких моделях и возвращает результаты, теперь я хотел бы объединить все эти результаты модели в одну переменную, чтобы я мог использовать только одну переменную в моем блейде.

Как я могу это сделать?

Код

public function results(Request $request) {
    $q = $request->input('q');

    $products = Product::where('name', 'like', "%{$q}%")
        ->orWhere('body', 'like', "%{$q}%")
        ->paginate(9);

    $posts = Post::where('name', 'like', "%{$q}%")
        ->orWhere('body', 'like', "%{$q}%")
        ->paginate(9);

    $pages = Page::where('name', 'like', "%{$q}%")
        ->orWhere('body', 'like', "%{$q}%")
        ->paginate(9);

    $tags = Tag::where('name', 'like', "%{$q}%")
        ->paginate(9);

    $jobs = Job::where('name', 'like', "%{$q}%")
        ->orWhere('body', 'like', "%{$q}%")
        ->paginate(9);

    $categories = Category::where('name', 'like', "%{$q}%")
        ->orWhere('body', 'like', "%{$q}%")
        ->paginate(9);

    $listings = Listing::where('name', 'like', "%{$q}%")
        ->orWhere('body', 'like', "%{$q}%")
        ->paginate(9);

    $portfolios = Portfolio::where('name', 'like', "%{$q}%")
        ->orWhere('body', 'like', "%{$q}%")
        ->paginate(9);

    $services = Service::where('name', 'like', "%{$q}%")
        ->orWhere('body', 'like', "%{$q}%")
        ->paginate(9);

    return view('front.pages.search', compact('products', 'q', 'pages', 'posts', 'tags', 'jobs', 'categories', 'listings', 'portfolios', 'services'))->withQuery($q);
}

Ответы [ 2 ]

1 голос
/ 04 февраля 2020

Вы можете сохранить результаты в массиве c вместо отдельных переменных.

public function results(Request $request) {

    $q = $request->input('q');

    $result = [];

    $result['products'] = Product::where('name', 'like', "%{$q}%")
    ->orWhere('body', 'like', "%{$q}%")
    ->paginate(9);

    $result['posts'] = Post::where('name', 'like', "%{$q}%")
    ->orWhere('body', 'like', "%{$q}%")
    ->paginate(9);

    $result['pages'] = Page::where('name', 'like', "%{$q}%")
        ->orWhere('body', 'like', "%{$q}%")
        ->paginate(9);

    $result['tags'] = Tag::where('name', 'like', "%{$q}%")
        ->paginate(9);

    $result['jobs'] = Job::where('name', 'like', "%{$q}%")
        ->orWhere('body', 'like', "%{$q}%")
        ->paginate(9);

    $result['categories'] = Category::where('name', 'like', "%{$q}%")
        ->orWhere('body', 'like', "%{$q}%")
        ->paginate(9);

    $result['listings'] = Listing::where('name', 'like', "%{$q}%")
        ->orWhere('body', 'like', "%{$q}%")
        ->paginate(9);

    $result['portfolios'] = Portfolio::where('name', 'like', "%{$q}%")
        ->orWhere('body', 'like', "%{$q}%")
        ->paginate(9);

    $result['services'] = Service::where('name', 'like', "%{$q}%")
        ->orWhere('body', 'like', "%{$q}%")
       ->paginate(9);

    return view('front.pages.search', compact($result))->withQuery($q);

}

0 голосов
/ 04 февраля 2020

Попробуйте сделать код более чистым,

Сначала определите массив имен всех ваших моделей.

Во-вторых, l oop имена этих моделей, сопоставьте с пространством имен, затем запросите его .

В-третьих, преобразуйте название модели во множественное число и верблюжий вид в качестве ключа и введите результат с помощью этого ключа.

use Illuminate\Support\Str;
...

$namespace = 'App\\';
$models = ["Product", "Post", "Page", "Tag", "Job", "Category", "Listing", "Portfolio", "Service"];

$data = array();
foreach($models as $model) {
    $key = str_plural(Str::camel($model));
    $data[$key] = ($namespace.$model)::where('name', 'like', "%{$q}%")
        ->orWhere('body', 'like', "%{$q}%")
        ->paginate(9);
}
dd($data);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...