2015-10-10 6 views
1

Я использую Lumen рамки. У меня есть одна проблема, мне нужно установить пользовательский аксессуар для атрибута, но проблема в том, что столбец в базе данных начинается с заглавной буквы.
Например, Logo. И в случае первой заглавной буквы accessor не вызывается во время извлечения объекта, я попытался использовать несколько столбцов, столбцы с именем начинается с маленькой буквы, отлично работает.Заглавная буква атрибута Laravel игнорируется

public function getLogoAttribute($value) 

Это сбруя не работает, потому что имя столбца Logo
Я не могу изменить название столбцов в базе данных, но нужно использовать аксессоров в моем приложении.
Я понимаю, что я могу изменить исходные коды Eloquent, но, возможно, есть другой способ заставить его работать.
Спасибо.

+0

Как вы реализовали метод доступа? –

+0

Не имеет значения, я реализую его так же, используя имя столбца, которое начинается с буквы нижнего регистра, и оно работает. – CROSP

+0

Храните аксессуар как есть, и попробуйте '$ model -> {'Logo'}', я должен был сделать это один раз для имени столбца, содержащего тире. – user2094178

ответ

1

Я провел несколько часов, пытаясь найти ответ на серфинг в сети, но решил найти эту часть кода самостоятельно.
Я нашел его.

Он расположен в vendor/illuminate/database/Eloquent/Model
Метод public function attributesToArray()

Изменить часть этого метода, как этот

$mutatedAttributes = $this->getMutatedAttributes(); 

     // We want to spin through all the mutated attributes for this model and call 
     // the mutator for the attribute. We cache off every mutated attributes so 
     // we don't have to constantly check on attributes that actually change. 
     foreach ($mutatedAttributes as $key) { 
      if (! array_key_exists($key, $attributes)) { 
       if(array_key_exists(ucfirst($key), $attributes)) { 
        $key = ucfirst($key); 
       } 
       else { 
        continue; 
       } 
      } 

Если у вас есть несколько заглавных букв в имени столбца, это не будет работать.

Это плохое решение для этой проблемы, просто укажите столбцы базы данных по соглашению, и у вас не будет никаких проблем (у меня есть возможность изменить имя столбца в моем случае).

UPDATE

Вы также можете изменить класс, как этот

/** 
    * Indicates if the model mutated attributes can have different case from ex. User_comments instead of user_comments. 
    * 
    * @var bool 
    */ 
    public $upperCaseMutatedAttributes = false; 

if($this->upperCaseMutatedAttributes && array_key_exists(ucfirst($key), $attributes)) { 
        $key = ucfirst($key); 
       } 

Вы можете переопределить эту переменную в своем классе.

+0

Я думаю, вы должны принять свой ответ, пока у нас не будет лучшего способа решить проблему. Кроме того, я считаю, что важно перекрестно ссылаться на этот вопрос с вашим [сообщением Laracasts] (https://laracasts.com/discuss/channels/lumen/laravel-attribute-accessor-capital-letter-is-ignored), в котором вы подробно расскажите о своих шагах по пути решения. Спасибо за это! –

 Смежные вопросы

  • Нет связанных вопросов^_^