라라벨(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);
}
  • share