InvalidFieldNameException 使用 Laravel 原则

InvalidFieldNameException using Laravel Doctrine

我正在将 Zend Framework 1 应用程序转换为 Laravel 应用程序。我使用的是 Doctrine,所以我将模型移到了 Laravel。我正在使用 laravel-doctrine

字段是用驼峰式写的,当通过 doctrine 创建数据库时,它们也是用驼峰式创建的,像这样:

/**
 * @ORM\Entity (repositoryClass="Repositories\Customer")
 * @ORM\Table(name="customers")
 * @ORM\HasLifecycleCallbacks
 */
class Customer
{
    /**
     * @ORM\Id @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /** @ORM\Column(type="string", length=255, nullable=true) */
    protected $firstName;

    /** @ORM\Column(type="string", length=255, nullable=true) */
    protected $lastName;

    /** @ORM\Column(type="string", length=255, nullable=true) */
    protected $companyName;

当我执行 EntityManager::find('App\Entities\Customer', 1); 时出现此错误:

An exception occurred while executing 'SELECT t0.id AS id_1, t0.firstName AS firstName_2, t0.lastName AS lastName_3, t0.company_name AS company_name_4, t0.email AS email_5, t0.phone_number AS phone_number_6, t0.type AS type_7, t0.created AS created_8, t0.updated AS updated_9, t0.jobsource_id AS jobsource_id_10 FROM customers t0 WHERE t0.id = ?' with params 1: SQLSTATE[42S22]: Column not found: 1054 Unknown column 't0.company_name' in 'field list'

寻找下划线是有原因的吗?我有办法改变它吗?

我正在使用 PHP 7.0.1

Snake case 是许多框架的默认列名称样式。您可以通过 属性:

指定 table 列名称
/** @Column(type="string", length=255, name="companyName", nullable=true) */
private $companyName;

您可以更改整体命名策略,see the docs for that. Laravel doesn't support it out of the box, but it is relatively few changes needed to make it work。 如果您不想弄乱您的 Laravel 代码,还有具有此功能的 drop-in replacement for Doctrine 以及更多 built-in.

laraveldoctrine.org支持定义自定义命名策略:

Doctrine\ORM\Mapping\DefaultNamingStrategy可能就是你要找的那个

在 doctrine.php 配置文件中:(在您将其发布到您的项目之后)

'managers'                  => [
        'default' => [
            'naming_strategy' => 'Doctrine\ORM\Mapping\DefaultNamingStrategy',
            'dev'        => env('APP_DEBUG'),
            'meta'       => env('DOCTRINE_METADATA', 'annotations'),
            'connection' => env('DB_CONNECTION', 'mysql'),
            'paths'      => [
                base_path('app')
            ],
           ....
      ]
]

如果你想要一个自定义的,根据以下实施命名策略:http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/namingstrategy.html