提问者:小点点

带关系的Laravel搜索


在我的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_名称。由于这种关系,我将category_id存储在Items表中,但我想在我的雄辩查询中使用category_名称。

谁能提供一些帮助?

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

建议一:

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

=

传递给App\Http\Controller\ItemController的参数1::App\Http\Controller{闭包}()必须是App\Http\Controller\App\Class的实例,Illumate\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);
           })

=

解决方案

  $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个答案

匿名用户

正如您已经在项目模型中描述了与类别的关系,您必须仅使用whereHas方法:

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

匿名用户

您可以添加一个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);