【问题标题】:Laravel Eloquent - Existing Database with Mix of snake_case and camelCase ColumnsLaravel Eloquent - 混合了蛇案例和骆驼案例列的现有数据库
【发布时间】:2017-08-16 23:13:55
【问题描述】:

我有一个大型的现有数据库,我想用 Laravel/Eloquent 访问它。

  • 我使用的是 Laravel 5.2,
  • 我使用“user11001/eloquent-model-generator”包生成了模型
  • 我使用命令php artisan ide-helper:models 生成了自动补全

但是,我的数据库包含一个混合的 snake_case 和 camelCase 列,并且每当我尝试访问 camelCase 列“seoAlias”时,代码如下:

$x = AdvertiserModel::whereSeoAlias('someValue')->get();

我收到以下错误:

SQLSTATE[42S22]:未找到列:1054 中的未知列 'seo_alias' 'where子句'

谁有使用 Laravel混合snake_case 和 camelCase 列访问数据库的解决方案?

谢谢,

【问题讨论】:

    标签: php mysql laravel eloquent camelcasing


    【解决方案1】:

    我认为这很好。 Eloquent 在 L3 中需要 camel_case,我认为让人们将他们的整个数据库转换为 L4 的 camelCase 并不是超级实用的。记住什么时候使用很容易的东西:

    Class names are study case and methods are camel case (PSR-1).
    Eloquent attributes can be accessed using either snake or camel case, but database tables and columns are snake case.
    Configuration options, language lines, and view names are snake case and use "dot" syntax.
    Global functions are snake case per PHP convention.
    Input can be whatever you want.
    

    这就是它的全部内容。

    【讨论】:

    • 我认为重命名大型现有数据库的一半列以使其与 Laravel 一起使用是不切实际的
    【解决方案2】:

    如果您的列名是 seoAlias,您可以使用以下内容:

    $x = AdvertiserModel::where('seoAlias','=','someValue')->get();
    

    这样您就可以使用 eloquent 访问数据库,而无需重命名列。

    【讨论】:

    • 它不像我想要的那样类型安全,但它确实有效。所以我想它必须这样做
    【解决方案3】:

    这有点棘手,但您可以从 QueryBuilder 中删除 Str::snake。为此,您需要扩展基本模型并覆盖 newBaseQueryBuilder() 以使用我们自己的 QueryBuilder。

    <?php
    
    use Illuminate\Database\Query\Builder as QueryBuilder;
    
    abstract class Model extends \Illuminate\Database\Eloquent\Model
    {
        protected function newBaseQueryBuilder()
        {
            $connection = $this->getConnection();
    
            return new class(
                $connection,
                $connection->getQueryGrammar(),
                $connection->getPostProcessor()
            ) extends QueryBuilder {
                protected function addDynamic($segment, $connector, $parameters, $index)
                {
                    $bool = strtolower($connector);
    
                    // here we remove the Str::snake (in illuminate/database/Query/Builder.php)
                    $this->where($segment, '=', $parameters[$index], $bool);
                }
            };
        }
    }
    

    现在扩展了这个模型,它应该可以工作了。

    【讨论】:

      猜你喜欢
      • 2021-03-31
      • 2020-02-10
      • 1970-01-01
      • 2017-05-08
      • 1970-01-01
      • 1970-01-01
      • 2022-06-11
      • 2019-10-30
      • 1970-01-01
      相关资源
      最近更新 更多