Laravel Eloquent - 混合了 snake_case 和 camelCase 列的现有数据库

Laravel Eloquent - Existing Database with Mix of snake_case and camelCase Columns

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

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

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

我收到以下错误:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'seo_alias' in 'where clause'

有没有人有解决方案来访问具有 snake_case 的 mix 和使用 Laravel 的 camelCase 列的数据库?

谢谢,

我觉得怎么样都好。 Eloquent 在 L3 中需要 camel_case,而且我认为让人们将他们的整个数据库转换为 L4 的驼峰命名法不是很实用。记住何时使用非常简单:

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.

真的就这些了。

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

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

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

这有点棘手,但您可以从 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);
            }
        };
    }
}

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