Есть ли способ получить текущую таблицу базы данных, используемую моделью, в которой я работаю? Я вижу, что в Laravel/Database/Eloquent/model.php есть функция table(), но мне не удалось вызвать ее из модели, в которой я нахожусь.
Как вернуть имя таблицы базы данных в Laravel
Ответы (12)
Существует общедоступный метод getTable(), определенный в Eloquent\Model, поэтому вы должны иметь возможность использовать $model->getTable()
.
app(Model::class)->getTable();
- person iSWORD; 07.06.2020
Model::class
— это просто строка. Вы можете передать его в командной строке и использовать переменную. например app($modelClass)->getTable()
. Однако он должен включать пространство имен.
- person iSWORD; 05.10.2020
У Тейлора есть ответ на ваш вопрос:
В классе модели вы можете сделать что-то вроде этого:
return with(new static)->getTable();
Если вы хотите, чтобы все ваши модели имели возможность статически возвращать имя таблицы, то примерно так:
class BaseModel extends Eloquent {
public static function getTableName()
{
return with(new static)->getTable();
}
}
class User extends BaseModel {
}
User::getTableName();
vendor
.
- person Tainmar; 18.04.2019
with
здесь.
- person Yevgeniy Afanasyev; 06.06.2019
with(new static)
лучше, чем (new static)
? laravel.com/docs/5.7/helpers#method-with
- person Yevgeniy Afanasyev; 07.02.2020
with(new Class)
и просто (new Class)
, я получаю тот же результат. Спасибо, что напомнили
- person poring91; 11.02.2020
В моем случае я использую laravel 5.4.
return (new static)->getTable();
Поскольку table
является защищенным свойством в классе Model (Laravel >= 5), вам понадобится экземпляр вашей модели.
Вот пример:
DB::table( (new YourModelClassname)->getTable() )
->update(['field' => false]);
Основываясь на ответе Lucky Soni, есть еще один простой трюк, если вы хотите напрямую вызвать его из Vontroller или Просмотреть.
Протестировано в Laravel 6, и я продолжаю использовать его, если вы «программист одной строки», который ненавидит объявление экземпляра дополнительной строки. Нет необходимости в дополнительных строках в файле модели.
$string_table_name = with(new \App\Model\TableModelName)->getTable();
или лучше, вы также можете просто назвать это
$string_table_name = (new \App\Model\TableModelName)->getTable();
Он вернет простую строку имени таблицы, даже если вы переименуете переменную $table
внутри класса модели.
ИЗМЕНИТЬ:
Минус репутация?? Возможно, вы должны сначала попробовать это в своем контроллере вместо того, чтобы создавать новую функцию в классе модели только для получения имени таблицы и не нужно объявлять объект при вызове.
with()
сама по себе является вспомогательной функцией Laravel, которая возвращает объект класса. а внутри класса, который расширяет модель, уже есть функция getTable()
. Таким образом, вам не нужно помещать еще одну новую избыточную функцию в класс модели. Кажется, последняя версия, вы можете просто вызвать (new Class)
без функции with()
.
Разница между этим ответом и ответом Лаки в том, что мой не создает никакой новой функции внутри класса модели для получения имени таблицы, даже вы можете просто вызвать функцию внутри контроллера и представления, не объявляя объект класса модели. Это для украшения кода.
В то время как ответ Lucky создает новую функцию внутри класса Model, и вам нужно вызвать функцию из объекта.
with()
?
- person Ewan; 10.02.2020
with()
— это функция Laravel, которая возвращает объект. А getTable — предопределенная функция внутри класса Model.
- person poring91; 11.02.2020
with()
допускает цепочку, если это невозможно иначе, но не требуется, если методы уже возвращают свой собственный экземпляр класса. Я бы сказал, что -1 потому что это скорее комментарий, чем ответ? У меня было то же самое, что разочаровывает, но именно так работает StackOverflow.
- person Ewan; 11.02.2020
Вы можете получить имя таблицы модели статическим образом, используя следующий код:
Если у нас есть модель как ModelName:
ModelName::query()->getQuery()->from
Этот метод также отлично работает в случае пользовательского имени таблицы, которое определено protected $table = 'custom_table_name'
в модели.
другое решение - использовать помощник resolve
следующим образом:
resolve('\\App\\Models\\User')->getTable()
Я просто хотел добавить следующее для людей, пришедших из поисковых систем:
Если вы вообще не хотите создавать экземпляр модели (быстрее?):
$model = 'App\User';
$modelTable = str_replace('\\', '', Str::snake(Str::plural(class_basename($model))));
dd($modelTable); // will return "users"
Это может выглядеть некрасиво, но именно так метод getTable() разрешает это под капотом, так что...
Вам нужно будет use Illuminate\Support\Str;
поверх вашего файла.
Приложение: подразумевается, что вы следуете стандартам фреймворка (т. е. модель Post
имеет таблицу posts
, модель пользователя имеет таблицу users
и т. д.)
Простой способ получить имя таблицы из модели Laravel следующим образом:
$tableName = app(\App\User::class)->getTable();
Не забудьте заменить:
\Приложение\Пользователь
С путем модели.
Основываясь на ответе от Отвелла, вы можете использовать что-то вроде этого:
with(new Model)->getTable();
Примечание: проверено на версиях 5.x, 6.x, 7.x, 8.x, работает хорошо.
В Laravel 4 используйте метод static
$table_name = Model::getTable();
или "self" внутри Eloquent Model
$table_name = self::getTable();
$model = new Model(); $table_name = $model->getTable();
(я использую Laravel 4.1.30).
- person nexus-bytes; 26.06.2014
self::getTable()
. Ларавель 5.5.
- person curveball; 16.01.2018