使用变量中的模型名称

时间:2019-03-22 02:41:21

标签: laravel laravel-5

我有一个变量,可以像这样保存模型名称

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'不是   找到”,

5 个答案:

答案 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