Laravel: Eloquent Как получить свойство модели, если имя столбца содержит тире?

У меня есть следующее в моем корневом маршруте:

$user = User::all();
return $user->column-one;

Что возвращает исключение Использование неопределенной константы один - предполагается "один", хотя у меня есть столбец с именем column-one из моей таблицы пользователей. Итак, как мне получить column-one из моей модели?


person camelCaseD    schedule 04.01.2014    source источник
comment
Да, у вас явно не может быть переменной с тире, отсюда и проблема. Вы не всегда будете иметь контроль над базой данных и, возможно, вам придется иметь дело со столбцом, в имени которого есть тире. Указать плакату правильное направление использования функций Laravel getAttribute было бы гораздо полезнее, чем сделать общее заявление об изучении PHP.   -  person thaspius    schedule 21.03.2014
comment
Для downvoter это реальная проблема, с которой многие из нас сталкивались или столкнутся. Перед голосованием прочитайте комментарий @thaspius   -  person Pooyan Khosravi    schedule 25.07.2014


Ответы (2)


Покопавшись в исходном коде красноречивой модели, я нашел волшебный метод __get и узнал, что это просто оболочка для общедоступной функции getAttribute, которая принимает строку, поэтому теперь я могу получить столбец через $user->getAttribute('column-one');.

Редактировать:
См. комментарий @Alexandre Butynski ниже для лучшего решения, чем то, которое я использовал.

person camelCaseD    schedule 04.01.2014
comment
Вы должны использовать геттер в своей модели, например function getColumnOneAttribute(), тогда вы сможете получить доступ к своему свойству следующим образом: $use->column_one. Прочтите документ: laravel.com/docs/eloquent#accessors-and-mutators. - person Alexandre Butynski; 04.01.2014
comment
Привет @camelCaseD, твое решение работает. Идея @Alexandre мне не подходит. У меня был такой столбец, как U1-U2_max, и я создал функцию доступа как public function getU1U2MinAttribute($value){ return $value; }. Дело в том, что laravel не знает, как поставить тире между U1 и U2. Если бы это было подчеркивание между U1 и U2, то это сработало бы. Назначение аксессора — форматировать красноречивый атрибут при извлечении из модели. Это сработало для меня {{ $post->resultats_electrique->getAttribute('U1-U2_min') }} - person Fokwa Best; 08.09.2016

Я не пробовал это, но мне любопытно, сработает ли для этого использование camelCase. Вот как это работает для таких вещей, как маршруты. Например: $user->columnOne.

Однако я бы рекомендовал переименовать этот столбец. Это действительно не очень хорошо отображается в приложении PHP.

Обновить - Попробуйте это:

$user->{"столбец-один"}

person LF.    schedule 04.01.2014
comment
К сожалению, это возвращает null - person camelCaseD; 04.01.2014
comment
Спасибо, но мой ответ ниже был найден после небольшого дополнительного копания в исходном коде. - person camelCaseD; 04.01.2014
comment
@camelCaseD: Ваш ответ может быть немного медленнее, чем он того стоит. Очень рекомендую переименовать этот столбец... :) - person LF.; 04.01.2014
comment
Вероятно, это хорошая идея, чтобы попробовать вещи, прежде чем публиковать их. - person Mick; 22.09.2020