라라벨
라라벨(Laravel) - findOrFail / ModelNotFoundException
나는 반드시 해당 아이디에 해당하는 모델을 가져와야 하는 코드에서는 find 대신 findOrFail 을 사용하고 있다.
findOrFail은 해당 아이디에 해당하는 모델이 없으면 null를 반환하는 find와 달리 오류를 발생시킨다는 특징을 가지고 있다.
그런데, 이 때 발생하는 에러가 어떤 에러인지 몰라서 이번 기회에 찾아보기로 했습니다. 발생하는 에러는 `ModelNotFoundException` 이 였습니다.
ModelNotFoundException Class (위치: \vendor\laravel\framework\src\Illuminate\Database\Eloquent\ModelNotFoundException.php)
<?php namespace Illuminate\Database\Eloquent; use RuntimeException; use Illuminate\Support\Arr; class ModelNotFoundException extends RuntimeException { /** * Name of the affected Eloquent model. * * @var string */ protected $model; /** * The affected model IDs. * * @var int|array */ protected $ids; /** * Set the affected Eloquent model and instance ids. * * @param string $model * @param int|array $ids * @return $this */ public function setModel($model, $ids = []) { $this->model = $model; $this->ids = Arr::wrap($ids); $this->message = "No query results for model [{$model}]"; if (count($this->ids) > 0) { $this->message .= ' '.implode(', ', $this->ids); } else { $this->message .= '.'; } return $this; } /** * Get the affected Eloquent model. * * @return string */ public function getModel() { return $this->model; } /** * Get the affected Eloquent model IDs. * * @return int|array */ public function getIds() { return $this->ids; } }
public function findOrFailActivatedItem(string $instanceId)
{
$activatedIds = ReplyConfigHandler::make()->getActivateInstanceIds();
if (in_array($activatedIds, $activatedIds) === false) {
throw (new ModelNotFoundException)->setModel(MenuItem::class);
}
return MenuItem::where('type', 'board@board')->where('activated', true)->findorFail($instanceId);
}
0개 댓글