У меня в приложении 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');
}
}
Я хочу реализовать функцию поиска, поэтому я создал следующий запрос Eloquent:
$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_id хранится в таблице «Предметы», но я хотел бы использовать имя категории в своем запросе Eloquent.
Кто-нибудь может предоставить некоторую помощь?
На основаниипо полученной обратной связи я попытался:
Предложение 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);