public function findBy($attribute, $value, $columns = ['*'], $with = [])
    {
        $cacheKey = $this->generateKey([$attribute, $value, $columns, $with]);

        return $this->cacheResults(get_called_class(), __FUNCTION__, $cacheKey, function () use ($attribute, $value, $columns, $with) {
            return $this->model->with($with)
                ->where($attribute, '=', $value)
                ->first($columns);
        });
    }