Laravel Eloquent — существующая база данных со смесью столбцов snake_case и camelCase

У меня есть большая база данных, к которой я хотел бы получить доступ с помощью 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’ в
«где пункт»

У кого-нибудь есть решение для доступа к базе данных с микшировать столбцов snake_case и camelCase, использующих Laravel?

Спасибо,

1

Решение

Вы можете использовать следующее, если имя вашего столбца seoAlias:

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

Таким образом, вы сможете получить доступ к базе данных с помощью eloquent без переименования столбцов.

1

Другие решения

Это немного сложно, но вы можете удалить Str::snake из QueryBuilder. Для этого вам нужно расширить базовую модель и переопределить 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);
}
};
}
}

Сейчас расширяет эту модель и она должна работать.

0

Я думаю, это нормально, как это. Eloquent требовал camel_case в L3, и я не думаю, что это супер практично, когда люди конвертируют все свои базы данных в camelCase для 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.

Это действительно все, что нужно сделать.

-1