我有一个变量,可以像这样保存模型名称
dict
现在,我想像这样使用模型插入数据库
$fooTableName = 'foo_defs';
$fooModel = 'FooDefs';
引发错误
$fooModel::insert([..foo..array...]);
是否可以做类似的事情?还是会被迫使用
"message": "Parse error: syntax error, unexpected '$fooModel' (T_VARIABLE), expecting identifier (T_STRING)",
如果我采用后一种方式,则表中的时间戳是错误的。 DB::table('fooTableName')->insert([...foo...array...]);
列为空,并且created_at
的值为
编辑1
updated_at
他们中的大多数人都说这是名称空间问题,所以我已对其进行了纠正,但它仍然会像抛出错误一样
“消息”:“类'/ var / www / html / erp / app / Models / sales / InvoiceDefs'不是 找到”,
答案 0 :(得分:1)
尝试以下一项,
$fooModel = new FooDefs();
然后您还可以执行以下操作
$fooModel->column1 = $value1;
$fooModel->column2 = $value2;
$fooModel->column2 = $value2;
$fooModel->save();
或
$fooModel->save([
'column1' => $value1,
'column2' => $value2,
'column3' => $value3,
])
修改后的答案
$path = 'my\project\path\to\Models';
$fooModel = app($path.'\FooDefs');
$fooModel::save([
'column1' => $value1,
'column2' => $value2,
'column3' => $value3,
])
dd($fooModel ::all());
尝试编辑后的答案。
答案 1 :(得分:1)
我以前也有相同的情况,并且我已经创建了执行此操作的功能
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());
您可以随意自定义功能
希望有帮助
答案 2 :(得分:0)
您在做什么错是使用模型名称作为字符串,您需要像下面这样重构代码:
$fooModel = 'App\Models\FooDefs';
答案 3 :(得分:0)
当您将类的名称存储为字符串时,可以像这样使用php方法call_user_func_array
在该类上调用方法
$class_name = "FooDefs";
call_user_func_array(array($class_name, "insert"), $data);
$data
是一个数据数组,它将作为参数传递给调用函数。
只是简单的建议如果您将{<1> FQN Fully Qualified Name类的{strong> FQN 保存在$class_name
变量中,那将是好 {1}}后跟类的名称。出于示例目的,FQN看起来像__NAMESPACE__
,使用Illuminate\Support\Facades\DB
保存时可以得到,假设您有一些用户模型。如果使用Laravel,则将返回用户模型的全限定名称为User::class
。
答案 4 :(得分:0)
$requests = $post['request'] // posting the data from view page
$models = "app\models".'\\'.$requests //geting the model
$model = $models::findOne($referenceId) //fetching value from database