在我的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);
正如您已经在项目
模型中描述了与类别
的关系,您必须仅使用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);