почему я не получаю результатов запроса для модели в laravel? - PullRequest
0 голосов
/ 24 сентября 2018

Когда я ищу по названию города, которое доступно в моей таблице базы данных, оно покажет результат, но когда я буду искать по неизвестному городу, которого нет в моей таблице базы данных, оно говорит - Нет результатов запроса для модели [App \Город]. я делюсь с вами кодом и скриншотом см. Скриншот с ошибкой на самом деле я хочу перенаправить на страницу 401, если город не найден в моей таблице базы данных

Вот мойroute

Route :: get ('teacher-jobs-by-city / {city}', 'TeacherJobsController @ by_location');

Вот моя функция

publicfunction by_location ($ location_id = '') {

$data= array();
$location = City::where('slug',$location_id)->where('status','1')->firstOrFail();
$items= Subject::orderBy('id','asc')->get();
$data['location']=$location;

      //$subjects = [''=>'Select Subject'] + Subject::lists('subject_title','id')->toArray();
      //$city = [''=>'Select City'] + City::lists('name','id')->toArray();
        $active_class ='Select Subject to see job Openings';
        return view('frontend.teacherjobs.by_location',compact('active_class','data','items'));

    }

Ответы [ 4 ]

0 голосов
/ 25 марта 2019

Добавление к ответу Элиаса Соареса. Это происходит потому, что laravel генерирует исключение "Illuminate \ Database \ Eloquent \ ModelNotFoundException", если firstOrFail не возвращает результаты.

Ссылка: https://laravel.com/docs/5.8/eloquent#retrieving-single-models

Вам решать, как вы хотите обработать это исключение.При использовании решения firstOrFail -> to first ()

После замены firstOrFail на first вы получите сообщение об ошибке: «Попытка получить свойство не объекта», потому что ваш запрос ничего не получил, поэтомуне будет иметь атрибута.Для этого вы можете проверить результаты вашего запроса.

$location = City::where('slug',$location_id)->where('status','1')->first();

!empty($location->attribute)?$location->attribute:null;
0 голосов
/ 24 сентября 2018

Вы можете обработать такого рода ошибки, изменив способ обработки Illuminate\Database\Eloquent\ModelNotFoundException Исключение.В классе App\Exceptions\Handler измените метод рендеринга так, чтобы он выглядел следующим образом

public function render($request, Exception $exception)
{
    if($exception instanceof ModelNotFoundException){
        return redirect("/error_page", 401)->with('error', $e->getMessage());
    }
    return parent::render($request, $exception);
}

В перенаправлении вы должны указать маршрут, на который вы хотите перенаправиться, я поставил /error_page только для примера.Вы можете узнать больше о Обработка ошибок '

Не забудьте импортировать исключение ModelNotFoundException, как это use Illuminate\Database\Eloquent\ModelNotFoundException;

0 голосов
/ 24 сентября 2018

Заменить это:

$location = City::where('slug',$location_id)->where('status','1')->firstOrFail();

На это:

$location = City::where('slug',$location_id)->where('status','1')->first();
0 голосов
/ 24 сентября 2018

Это потому, что вы используете метод firstOrFail(), который, как он назван, завершается ошибкой, если нет результата, генерируя исключение, которое будет отображено как сообщение «Нет результатов запроса для модели ...».

Если вы хотите, чтобы это не завершилось неудачей, вы можете:

  1. Окружить ваш запрос блоком try-catch, обработать исключение и вернуть какое-то сообщение
  2. Заменить firstOrFail()метод по first()
...