Laravel поиск с отношениями - PullRequest
       3

Laravel поиск с отношениями

0 голосов
/ 04 февраля 2019

У меня в приложении 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);

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Как вы уже описали отношение к Category в вашей Item модели, вы должны использовать только 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);
0 голосов
/ 04 февраля 2019

Вы можете добавить 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...