1

我有搜索功能,它可以搜索多个模型并返回结果,现在我想将所有这些模型结果放入一个变量中,这样我只能在刀片中使用一个变量。

我怎样才能做到这一点?

代码

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);
}
4

2 回答 2

1

您可以将结果存储在 assoc 数组中,而不是单独的变量中。

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);

}

于 2020-02-04T03:27:10.050 回答
0

试试这个让代码更干净,

首先定义所有模型名称的数组。

其次,循环这个模型的名称,与命名空间连接然后查询它。

第三,将模型名称转换为复数形式,以驼峰形式为键,并将结果与​​该键一起放入。

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);
于 2020-02-04T03:25:07.520 回答