Как я могу получить доступ к атрибутам, используя дело верблюда?
Чтобы быть последовательным в моем стиле кодирования, я хотел бы использовать camelCase
получить доступ к атрибутам вместо snake_case
, Возможно ли это в Laravel без изменения базовой структуры? Если так, то как?
Пример:
// Database column: first_name
echo $user->first_name; // Default Laravel behavior
echo $user->firstName; // Wanted behavior
3 ответа
Создайте свой собственный BaseModel
class and override the following methods. Make sure all your other models extend
ваш BaseModel
,
class BaseModel extends Eloquent {
// Allow for camelCased attribute access
public function getAttribute($key)
{
return parent::getAttribute(snake_case($key));
}
public function setAttribute($key, $value)
{
return parent::setAttribute(snake_case($key), $value);
}
}
Then for usage:
// Database column: first_name
echo $user->first_name; // Still works
echo $user->firstName; // Works too!
This trick revolves around forcing the key to snake case by overriding the magic method used in Model
,
Так как SO не позволяет вставлять фрагменты кода в комментарии, я публикую это как новый ответ.
Чтобы убедиться, что загрузка не прерывается, мне пришлось изменить ответ @Lazlo. При доступе к загруженным отношениям с помощью другого ключа они перезагружаются.
<?php
class BaseModel extends Eloquent
{
public function getAttribute($key)
{
if (array_key_exists($key, $this->relations)) {
return parent::getAttribute($key);
} else {
return parent::getAttribute(snake_case($key));
}
}
public function setAttribute($key, $value)
{
return parent::setAttribute(snake_case($key), $value);
}
}
Просто подумал, что выложу это на случай, если это кому-нибудь поможет. Хотя запись Bouke Versteegh великолепна, она не затрагивает ленивые отношения, которые используют случай с верблюдами. Когда это происходит, нам просто нужно проверить имя метода в дополнение к другим проверкам. Вот что я сделал:
class BaseModel extends Eloquent
{
public function getAttribute($key)
{
if (array_key_exists($key, $this->relations)
|| method_exists($this, $key)
)
{
return parent::getAttribute($key);
}
else
{
return parent::getAttribute(snake_case($key));
}
}
public function setAttribute($key, $value)
{
return parent::setAttribute(snake_case($key), $value);
}
}