У меня раньше была такая же ситуация, и я создал функцию для этого
function convertVariableToModelName($modelName='',$nameSpace='')
{
//if the given name space iin array the implode to string with \\
if (is_array($nameSpace))
{
$nameSpace = implode('\\', $nameSpace);
}
//by default laravel ships with name space App so while is $nameSpace is not passed considering the
// model namespace as App
if (empty($nameSpace) || is_null($nameSpace) || $nameSpace === "")
{
$modelNameWithNameSpace = "App".'\\'.$modelName;
}
//if you are using custom name space such as App\Models\Base\Country.php
//$namespce must be ['App','Models','Base']
if (is_array($nameSpace))
{
$modelNameWithNameSpace = $nameSpace.'\\'.$modelName;
}
//if you are passing Such as App in name space
elseif (!is_array($nameSpace) && !empty($nameSpace) && !is_null($nameSpace) && $nameSpace !== "")
{
$modelNameWithNameSpace = $nameSpace.'\\'.$modelName;
}
//if the class exist with current namespace convert to container instance.
if (class_exists($modelNameWithNameSpace))
{
// $currentModelWithNameSpace = Container::getInstance()->make($modelNameWithNameSpace);
// use Illuminate\Container\Container;
$currentModelWithNameSpace = app($modelNameWithNameSpace);
}
//else throw the class not found exception
else
{
throw new \Exception("Unable to find Model : $modelName With NameSpace $nameSpace", E_USER_ERROR);
}
return $currentModelWithNameSpace;
}
Как использовать это:
Аргументы
Первый аргумент => Название модели
Второй аргумент => Имя пространства модели
Например, у нас есть название модели Post
$ postModel = convertVariableToModelName ('Post');
dd($postModel::all());
Будет возвращать все значения в таблице posts
Но в некоторых ситуациях вы моделируете волю в
Пользовательское пространство имен, например App\Models\Admin\User
Итак, эта функция создана, чтобы преодолеть это
$userModel = convertVariableToModelName('User',['App','Models','Admin']);
dd($userModel::all());
Вы можете свободно настраивать функцию
Надеюсь, это поможет