Использование имени модели из переменной - PullRequest
0 голосов
/ 22 марта 2019

У меня есть переменная, которая содержит название модели примерно так

$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 равен нулю, а updated_at имеет значение

РЕДАКТИРОВАТЬ 1

 $model =  CustomHelper::getNameSpace($this->tableNames[$i]);
 // $model => /var/www/html/erp/app/Models/sales/InvoiceDefs
 $model::insert($this->tableCollections[$this->tableNames[$i]]);

Большинство из них сказали, что это проблема пространства имен, поэтомуЯ исправил это, но все равно это ошибка типа

"message": "Class '/ var / www / html / erp / app / Models / sales / InvoiceDefs' not found",

Ответы [ 4 ]

1 голос
/ 22 марта 2019

У меня раньше была такая же ситуация, и я создал функцию для этого

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());

Вы можете свободно настраивать функцию

Надеюсь, это поможет

1 голос
/ 22 марта 2019

Попробуйте следующий вариант,

$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());

Попробуйте мой отредактированный ответ.

0 голосов
/ 22 марта 2019

Если у вас есть имя класса, хранящееся в виде строки, вы можете вызвать метод для этого класса, используя метод php call_user_func_array, например,

$class_name = "FooDefs";
call_user_func_array(array($class_name, "insert"), $data);

$data - массив данных, который будет передан вызываемой функции в качестве аргументов.

Просто для простого совета Это будет Хорошо , если вы сохраните в $class_name переменную FQN Полное имя класса, который является __NAMESPACE__ следуйте по названию класса. В качестве примера FQN выглядит как Illuminate\Support\Facades\DB, который вы можете получить при сохранении, используя User::class Я предполагаю, что у вас есть какая-то модель пользователя. Это вернет Полностью квалифицированное имя пользователя, модель будет App\User в случае Laravel.

0 голосов
/ 22 марта 2019

То, что вы делаете неправильно, использует название модели в виде строки , вам необходимо изменить код, как показано ниже:

$fooModel = 'App\Models\FooDefs';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...