提问者:小点点

如何在Laravel中应用相关模型的搜索查询?


我有个问题。

我正在做一个搜索功能,用户将通过表单输入他们想要搜索的产品,然后返回产品。

这是表格。

<form action="{{ route('shopAll') }}">
    <input type="text" name="search" placeholder="Search Products...">
    <button type="submit"><i class="ti-search"></i></button>
</form>

产品php

    class Product extends Model{
        protected $fillable = [
        'name','added_by', 'user_id', 'category_id', 'subcategory_id', 'subsubcategory_id', 'brand_id', 'video_provider', 'video_link', 'unit_price',
        'purchase_price', 'unit', 'slug', 'colors', 'choice_options', 'variations', 'current_stock'
      ];

    public function category(){
        return $this->belongsTo(Category::class);
    }

    public function subcategory(){
        return $this->belongsTo(SubCategory::class);
    }

    public function subsubcategory(){
        return $this->belongsTo(SubSubCategory::class);
    }

    public function brand(){
        return $this->belongsTo(Brand::class);
    }
}

搜索控制器。php

    if($request->search){
        $data['products'] = 
            Product::where('name', 'LIKE', '%' . $request->search . '%')
            ->orWhere('tags', 'LIKE', '%' . $request->search . '%')
            ->orWhere('meta_title', 'LIKE', '%' . $request->search . '%')
            ->orWhere('slug', 'LIKE', '%' . $request->search . '%')
            ->get();
    } else {
        $data['products'] = Product::paginate(20);
    }
    
    return view('frontend.shop-all', $data);

我想让查询在类别、子类别、子类别和品牌上包括“或在哪里”,以便当用户想要搜索产品时,他们可以搜索品牌或与产品相关的任何属性。有人能帮我解决这个问题吗?

非常感谢你。


共1个答案

匿名用户

您可能想看看查询关系的whereHas/has方法。假设您希望搜索SearchController顶部关系(类别、子类别、子类别、品牌等)的name属性。php,添加以下行:

use Illuminate\Database\Eloquent\Builder;

然后按如下方式更新查询:

$data['products'] = 
        Product::where('name', 'LIKE', '%' . $request->search . '%')
        ->orWhere('tags', 'LIKE', '%' . $request->search . '%')
        ->orWhere('meta_title', 'LIKE', '%' . $request->search . '%')
        ->orWhere('slug', 'LIKE', '%' . $request->search . '%')
        ->orWhereHas('category', function (Builder $query) use ($request) {
            $query->where('name', 'like', '%' . $request->search . '%');
        })
        ->orWhereHas('subcategory', function (Builder $query) use ($request) {
            $query->where('name', 'like', '%' . $request->search . '%');
        })
        ->orWhereHas('subsubcategory', function (Builder $query) use ($request) {
            $query->where('name', 'like', '%' . $request->search . '%');
        })
        ->orWhereHas('brand', function (Builder $query) use ($request) {
            $query->where('name', 'like', '%' . $request->search . '%');
        })
        ->get();