Laravel搜索关系

时间:2019-02-04 09:02:10

标签: laravel eloquent

我的Laravel应用程序中具有以下关系

class Item extends Model 
{
    public function category()
    {
        return $this->belongsTo('App\Category');
    }
}

class Category extends Model
{
    public function item()
    {
        return $this->hasMany('App\Item');
    }
}

我想实现搜索功能,所以我创建了以下口才查询:

$items = Item::where('item_type', '=', 'type1')
         ->where(function($query) use ($q) {
            $query->where('item_name','LIKE','%'.$q.'%')
                  ->orWhere('item_description','LIKE','%'.$q.'%');
         })
         ->paginate(10);

这可以按预期工作,并根据商品名称和描述返回“ q”的搜索结果。

下一步,我还要搜索category_name。由于这种关系,我在项表中存储了category_id,但是我想在我的口才查询中使用category_name。

任何人都可以提供帮助吗?


根据收到的反馈,我尝试了:

建议1:

$items = Item::where('item_type', '=', 'type1')
         ->where(function($query) use ($q) {
           $query
             ->where('item_name', 'LIKE' ,'%'.$q.'%')
             ->orWhere('item_description', 'LIKE' ,'%'.$q.'%');
           })
           ->whereHas('category', function (Category $query) use ($q) {
              $query->where('category_name', $q);
           })

=>这会给出以下错误消息:

  

参数1传递给   App \ Http \ Controllers \ ItemController :: App \ Http \ Controllers {closure}()   必须是App \ Http \ Controllers \ App \ Category的实例,   给定Illuminate \ Database \ Eloquent \ Builder

建议2:

$items = Item::where('item_type', '=', 'type1')
         ->where(function($query) use ($q) {
           $query
             ->where('item_name', 'LIKE' ,'%'.$q.'%')
             ->orWhere('item_description', 'LIKE' ,'%'.$q.'%');
           })
           ->whereHas('category', function ($query) use ($q) {
              $query->where('category_name', $q);
           })

=>这将不再导致任何搜索结果(也不适用于item_name和item_description)。

解决方案

  $items = Item::where('item_type', '=', 'type1')
            ->where(function($query) use ($q) {
                $query
                 ->where('item_name', 'LIKE' ,'%'.$q.'%')
                 ->orWhere('item_description', 'LIKE' ,'%'.$q.'%');
              })
            ->orWhereHas('category', function ($query) use ($q) {
                 $query->where('category_name', $q);
              })
            ->sortable(['id' => 'desc'])
            ->paginate(10);

2 个答案:

答案 0 :(得分:3)

您可以添加whereHas并对其进行约束。例如:

$items = Item::where('item_type', '=', 'type1')
    ->where(function($query) use ($q) {
        $query->where('item_name','LIKE','%'.$q.'%')
            ->orWhere('item_description','LIKE','%'.$q.'%');
    })
    ->whereHas('category', function($query) {
        $query->where('category_name', 'name');
    })
    ->paginate(10);

答案 1 :(得分:2)

正如您已经在Category模型中描述与Item的关系一样,您只需要使用whereHas method

$items = Item::where('item_type', '=', 'type1')
         ->where(function($query) use ($q) {
            $query->where('item_name','LIKE','%'.$q.'%')
                  ->orWhere('item_description','LIKE','%'.$q.'%');
         })
         ->orWhereHas('category', function ($query) use ($q) {
            $query->where('category_name', 'LIKE', "%$q%");
         })
         ->paginate(10);