document2使用数据库中的表列,而不是camelcase

kiayqfof  于 2021-06-25  发布在  Mysql
关注(0)|答案(2)|浏览(292)

你好吗?
所以,最近我决定从原则1.2迁移到原则2.5,现在我正在更新我所有的查询和所有需要的东西。
在原则1.2中,我将所有模型直接从php脚本中的数据库生成,我决定对原则2.5做同样的事情。我在用这个脚本(https://gist.github.com/tawfekov/4079388)生成实体。
问题是,它正在生成camelcase中的所有列名。我需要它们就像它们在数据库里一样。
数据库是这样的:数据库
下面是实体的样子(不管怎样,是它的一部分):实体
有人知道我怎么解决这个问题吗?我需要该脚本生成的列名与数据库匹配,而不是在camelcase中。
[编辑]这不是其他两个问题的重复。第一个问题看起来很有希望,但公认的答案对我不起作用。我尝试了几种命名策略,但没有一种对我有效。第二个问题和我的正好相反。

yh2wf1be

yh2wf1be1#

您可以将脚本中的字段名转换回大小写

function convertFieldName($input) {
    preg_match_all('!([A-Z][A-Z0-9]*(?=$|[A-Z][a-z0-9])|[A-Za-z][a-z0- 
    9]+)!', $input, $matches);
    $ret = $matches[0];
    foreach ($ret as &$match) {
        $match = $match == strtoupper($match) ? strtolower($match) : 
        lcfirst($match);
    }
    return implode('_', $ret);
 }
kxe2p93d

kxe2p93d2#

我最终使用了@abdou rayes建议的想法,尽管我不得不调整它。
在我的具体案例中,我在数据库中有一些列是camelcase,其他的是snake\u case。我必须保持实体的列名与数据库中的列名完全相同。
所以,在用这个脚本生成了所有的实体之后,我决定遍历生成的所有文件并查找需要替换的所有信息。就在每个“private$nameofVariable;”的上方数据库中有一个具有实际列名的注解。使用regex,我得到了所有实际的列名,以及声明的变量,然后用实际的列名替换变量。
代码如下所示:

// Changes the variables in the Entity
    $regex = '/ORM\\\\Column\(name="([^"]*)"|private \$([^;]*);/';
    $dir = new DirectoryIterator(__DIR__. '/entities');
    foreach ($dir as $fileinfo) {
        if (!$fileinfo->isDot()) {
            $str = file_get_contents($fileinfo->getRealPath());

            preg_match_all($regex, $str, $matches, PREG_SET_ORDER, 0);

            $variables = array();
            $databaseColumns = array();
            $both = array(&$databaseColumns, &$variables);
            array_walk($matches, function($v, $k) use ($both) { $both[$k % 2][] = $v; }); // to split the column names and the variable names (since the regex returns them in order)
            if( count($databaseColumns) != count($variables) ){ // just in case there are more items in one of the arrays than the other, something must have gone wrong
                echo "Error in file " . $fileinfo->getFilename();
                die;
            }

            $len = count($databaseColumns);
            for($i = 0; $i < $len; $i++){
                $actualColumnName = end($databaseColumns[$i]);
                $nameOfVariableInTheEntity = end($variables[$i]);
                $nameOfVariableInTheEntity = explode(" ", $nameOfVariableInTheEntity); // to remove possible extra stuff after the name of the variable, such as variables with default values in the database
                $nameOfVariableInTheEntity = $nameOfVariableInTheEntity[0];

                $str = str_replace('private $'.$nameOfVariableInTheEntity, 'private $'.$actualColumnName,$str); // replace the declaration of variable
                $str = str_replace('$this->'.$nameOfVariableInTheEntity, '$this->'.$actualColumnName,$str); // replace the usage of the old variables
            }
            file_put_contents(__DIR__.'/entities/'.$fileinfo->getFilename(),$str);
        }
    }

相关问题