【问题标题】:I am trying to create a search function from an Input field to search through multiple tables relationally linked together我正在尝试从输入字段创建搜索功能,以搜索相关链接在一起的多个表
【发布时间】:2021-08-14 15:52:13
【问题描述】:

我正在尝试通过多个表实现搜索。该项目是一个在线商店,有 3 个不同的表格,产品、类别和品牌。我只能搜索 Products 表,但似乎无法从我的刀片文件中获取相同的搜索字段来搜索类别或品牌并返回相关产品的结果。 我的 Blade 搜索输入

<form action="{{ url('/search-products') }}" method="post">
  {{ csrf_field() }}
  <div class="form-group">
    <div class="row" style="display: flex;">
      <input class="typeahead form-control form-control-lg" type="text" name="product" id="product" placeholder="Search item to buy here..." style="width: 220px;"> &nbsp
      <button type="submit" class="btn btn-primary">
        <i class="ti-search"></i>
    </div>
  </div>
</form>

我的控制器中的搜索功能

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Input;
use Illuminate\Support\Facades\Redirect;
use Image;
use App\Category;
use App\Brands;
use App\Product;
use DB;

class ProductController extends Controller
{
   public function searchProducts(Request $request) {
        $product = $request->input('product');

        $categories = Category::with('categories')->where(['parent_id' => 0])->get();

        $productsAll = Product::query()->where('product_name', 'LIKE', "%{$product}%")
        ->orWhere('state', 'LIKE', "%{$product}%")
        ->orWhere('lga', 'LIKE', "%{$product}%")
        ->orWhere('category_id', 'LIKE', "%{$product}%")->where('status', 1)->get();

        $breadcrumb = "<a href='/'>Home</a> / ".$product;

        return view('pages.results')->with(compact('categories', 'productsAll',  'product', 'breadcrumb'));
    }
}

我的产品模型

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Auth;
use Session;
use DB;

class Product extends Model
{
    protected $with = ['category'];

    public function category()
    {
        return $this->hasMany('App\Category', 'id');
    }
}

我的类别模型

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Category extends Model
{
    public function products(){
        return $this->hasMany('App\Product','id');
    }
}

我的品牌模型

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Brands extends Model
{
    //
}

【问题讨论】:

    标签: php mysql laravel


    【解决方案1】:

    我可以通过使用eloquent的join函数查询多个表来解决这个问题。我在控制器中编辑了我的搜索功能,如下所示

    public function searchProducts(Request $request) {
            $product = $request->input('product');
    
            $categories = Category::with('categories')->where(['parent_id' => 0])->get();
    
            $productsAll = Category::query()->join('products', 'products.category_id', '=', 'categories.id')
                                        ->where('categories.name', 'LIKE', "%{$product}%")
                                        ->orWhere('products.product_name', 'LIKE', "%{$product}%")
                                        ->where('products.status', 1)->get();
    
    
            $breadcrumb = "<a href='/'>Home</a> / ".$product;
    
            return view('pages.results')->with(compact('categories','productsAll','product','breadcrumb'));
    
        }
    

    还有我的类别控制器

    class Category extends Model implements Searchable
    {
        protected $table = 'categories';
        protected $fillable = [
            'name'
        ];
        public function categories(){
            return $this->hasMany('App\Category','id');
        }
    
        public function products(){
            return $this->hasMany('App\Product','id');
        }
    }
    

    还有我的产品控制器

    class Category extends Model implements Searchable
    {
        protected $table = 'categories';
        protected $fillable = [
            'name'
        ];
        public function categories(){
            return $this->hasMany('App\Category','id');
        }
    
        public function products(){
            return $this->hasMany('App\Product','id');
        }
    }
    

    【讨论】:

      【解决方案2】:

      要查找具有ProductsCategories,如给定的searchTerm,您可以执行以下操作:

      SearchController.php

      class SearchController extends Controller
      {
          public function index(Request $Request)
          {
              $searchTerm = $request->product;
      
              $categories = Categories::whereHas('products', function ($query) use ($searchTerm){
                  $query->where('name', 'like', '%'.$searchTerm.'%');
              })
              ->with(['products' => function($query) use ($searchTerm){
                  $query->where('name', 'like', '%'.$searchTerm.'%');
              }])->get();
      
              return view('search-results-view', compact('categories));
          }
      }
      

      然后,您将拥有一个 collectionCategories,其中 Products 已加载。

      $categories 传递给返回的视图(上图)后,您将能够在刀片文件中循环Categories 和相关的Products

      search-results-view.blade.php

      @foreach ($categories as $category)
        <h4>{{ $category->name }}</h4>
      
        @foreach ($category->products as $product)
          {{ $product->name }}
        @endforeach
      @endforeach
      

      您可以使用相同的主体来处理您的 Brands 模型。

      【讨论】:

      • 急切加载的产品的类别集合是在类别模型中还是在刀片文件中?
      • $categories 将被传递到您的刀片文件。我已经更新了我的答案给你一个例子。
      • 我已经尝试过了,它在输入类别名称时返回错误 SQLSTATE[42S22]: Column not found: 1054 Unknown column 'name' in 'where clause' (SQL: select * from products` 其中products.id in (11) 和 name like %Vehicle%)`输入实际产品时不返回任何内容
      • 您需要将where 子句中的字段替换为表中字段的名称。
      • 按照建议替换了该子句,并且在输入实际产品时不返回任何错误,但在两个实例中均未返回任何内容。 $cat = Category::whereHas('products', function ($query) use ($searchTerm){ $query-&gt;where('name', 'like', '%'.$searchTerm.'%'); }) -&gt;with(['products' =&gt; function($query) use ($searchTerm){ $query-&gt;where('product_name', 'like', '%'.$searchTerm.'%'); }])-&gt;get();
      猜你喜欢
      • 2013-08-20
      • 1970-01-01
      • 2017-03-31
      • 1970-01-01
      • 2014-12-02
      • 2016-01-26
      • 2020-04-18
      • 2022-12-06
      • 2021-02-06
      相关资源
      最近更新 更多