我的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);
答案 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);