Laravel где имеет полиморфное отношение c - PullRequest
0 голосов
/ 27 января 2020

Laravel 5,8. У меня есть таблица cats:

id | name
---------
1  | jim
2  | mary

и таблица colors:

id | color
----------
1  | white
2  | black

Я использую отношение polymorphi c, чтобы прикреплять цвета к кошкам (и другим существа). У меня есть таблица colorables:

id | color_id | colorable_id | colorable_type
---------------------------------------------
1  | 1        | 2            | 'App\Cat'

и в моей Cat модели у меня есть

public function colors()
{
  return $this->morphToMany('App\Color', 'colorable');
}

У меня есть этот код контроллера, чтобы получить всех кошек данного цвета:

public function index(Request $request)
{
  $cats = new Cat;
  if ($request->has('color')) {
    $color = $request->color;
    $cats->whereHas('colors', function ($query) use ($color) {
      $query->where('color_id', $color);
    });
  }
  return $cats->get();
}

Но он возвращает всех кошек независимо от их цвета.

Ответы [ 3 ]

1 голос
/ 27 января 2020

Вы объявляете кошек новым объектом, а затем запрашиваете его с условным условием. Попробуйте вместо этого

public function index(Request $request)
{
  $color = $request->has('color') : $request->get('color') : null;
  $cats = Cat::when($color, function ($query) use ($color) {
      $query->where('color_id', $color);
    })->get();
}
1 голос
/ 27 января 2020

Вы также можете использовать метод laravel when (), чтобы сделать ваш код более читабельным, ваш код должен выглядеть следующим образом.

public function index(Request $request)
{
    $cats = Cat::query();

    $query->when($request->has('color'), function ($q) {
        return $q->whereHas('colors', function ($query) use ($request->color){
             $query->where('color_id', $color);
        }
    });

    return $query->get();
}
0 голосов
/ 27 января 2020

Измените new Cat на Cat::query():

public function index(Request $request)
{
  $cats = Cat::query();
  if ($request->has('color')) {
    $color = $request->color;
    $cats->whereHas('colors', function ($query) use ($color) {
      $query->where('color_id', $color);
    });
  }
  return $cats->get();
}

или по-прежнему используйте new, но назначьте переменную при запросе:

public function index(Request $request)
{
  $cats = new Cat;
  if ($request->has('color')) {
    $color = $request->color;
    $cats = $cats->whereHas('colors', function ($query) use ($color) {
      $query->where('color_id', $color);
    });
  }
  return $cats->get();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...