Как вернуть имя таблицы базы данных в Laravel

Есть ли способ получить текущую таблицу базы данных, используемую моделью, в которой я работаю? Я вижу, что в Laravel/Database/Eloquent/model.php есть функция table(), но мне не удалось вызвать ее из модели, в которой я нахожусь.


person Chris G    schedule 29.12.2012    source источник


Ответы (12)


Существует общедоступный метод getTable(), определенный в Eloquent\Model, поэтому вы должны иметь возможность использовать $model->getTable().

person Flyn San    schedule 28.12.2013
comment
Ну, похоже, это работает, только если у вас есть реальный экземпляр модели. Он не работает при вызове статической функции. - person Robert; 11.12.2019
comment
@Robert, он вызывает метод экземпляра, а не статический метод, поэтому нет ничего, что указывало бы на существование статического метода. - person Ewan; 10.02.2020
comment
Вам не обязательно иметь экземпляр. Вы могли бы сделать app(Model::class)->getTable(); - person iSWORD; 07.06.2020
comment
@iSWORD, если мы хотим получить имя модели из командной строки, как мы можем его назвать - person saber tabatabaee yazdi; 05.10.2020
comment
@sabertabaeeeyazdi 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();
person Lucky Soni    schedule 29.06.2014
comment
Для Laravel 5.3 вы должны поместить это в Illuminate\Database\Eloquent\Model. Работает нормально, спасибо! - person Santee; 27.09.2017
comment
Никогда не делай этого @Santee. Никогда не меняйте файлы внутри папки vendor. - person Tainmar; 18.04.2019
comment
Вы правы, Тейнмар. Спасибо. - person Santee; 23.04.2019
comment
Я не вижу преимуществ использования with здесь. - person Yevgeniy Afanasyev; 06.06.2019
comment
@Евгений Афанасьев в этом есть польза. Я могу сделать это в однострочном внутри контроллера. Смотри мой ответ - person poring91; 05.02.2020
comment
@poring91 почему это with(new static) лучше, чем (new static)? laravel.com/docs/5.7/helpers#method-with - person Yevgeniy Afanasyev; 07.02.2020
comment
@Евгений Афанасьев Я верю в это, поскольку laravel.com/docs/5.2/helpers#miscellaneous и каким-то образом отсутствует в некоторых версиях, with можно использовать для цепочки методов. Но, кажется, есть обновление для более новой версии, и когда я тестирую его, используя with(new Class) и просто (new Class), я получаю тот же результат. Спасибо, что напомнили - person poring91; 11.02.2020

В моем случае я использую laravel 5.4.

return (new static)->getTable();

person sh6210    schedule 10.01.2018

Поскольку table является защищенным свойством в классе Model (Laravel >= 5), вам понадобится экземпляр вашей модели.

Вот пример:

        DB::table( (new YourModelClassname)->getTable() )
            ->update(['field' => false]);
person Lorenz Lo Sauer    schedule 11.08.2015

Основываясь на ответе 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, и вам нужно вызвать функцию из объекта.

person poring91    schedule 05.02.2020
comment
Это больше похоже на ответ Лаки Сони, чем на ответ Лаки Сони. Как указано в его ответе, для чего здесь используется with()? - person Ewan; 10.02.2020
comment
вау... -1 ? К счастью, Sony поместила код внутри модели. Но мой способ можно просто поместить внутрь контроллера без добавления кода внутри класса Model. В этом разница с более эффективной линией. with() — это функция Laravel, которая возвращает объект. А getTable — предопределенная функция внутри класса Model. - person poring91; 11.02.2020
comment
with() допускает цепочку, если это невозможно иначе, но не требуется, если методы уже возвращают свой собственный экземпляр класса. Я бы сказал, что -1 потому что это скорее комментарий, чем ответ? У меня было то же самое, что разочаровывает, но именно так работает StackOverflow. - person Ewan; 11.02.2020

Вы можете получить имя таблицы модели статическим образом, используя следующий код:

Если у нас есть модель как ModelName:

ModelName::query()->getQuery()->from

Этот метод также отлично работает в случае пользовательского имени таблицы, которое определено protected $table = 'custom_table_name' в модели.

person BABAK ASHRAFI    schedule 30.06.2020

другое решение - использовать помощник resolve следующим образом:

resolve('\\App\\Models\\User')->getTable()
person rasterix    schedule 16.03.2021

Я просто хотел добавить следующее для людей, пришедших из поисковых систем:

Если вы вообще не хотите создавать экземпляр модели (быстрее?):

$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 и т. д.)

person Musa    schedule 22.08.2019
comment
Это работает до тех пор, пока вы не перезаписываете табличную переменную, чтобы использовать другую таблицу в модели. - person Ludwig; 03.12.2019
comment
Я бы сказал, что это определенно не правильный подход. Предположение слишком многого на основе имени класса модели, скорее всего, приведет к проблемам. И, как указал Людвиг, это не сработает, если вы перезапишете табличную переменную. - person Ewan; 10.02.2020
comment
Вы оба, кажется, игнорируете дополнение. - person Musa; 13.02.2020

Простой способ получить имя таблицы из модели Laravel следующим образом:

$tableName = app(\App\User::class)->getTable();

Не забудьте заменить:

\Приложение\Пользователь

С путем модели.

person AnasSafi    schedule 03.09.2020

Основываясь на ответе от Отвелла, вы можете использовать что-то вроде этого:

with(new Model)->getTable();

Примечание: проверено на версиях 5.x, 6.x, 7.x, 8.x, работает хорошо.

person Yassine Qoraiche    schedule 17.10.2020

В Laravel 4 используйте метод static

$table_name = Model::getTable();

или "self" внутри Eloquent Model

$table_name = self::getTable();
person HiTech    schedule 09.03.2014
comment
Кажется, что функция getTable() не статична - вам нужен экземпляр модели, чтобы получить таблицу: $model = new Model(); $table_name = $model->getTable(); (я использую Laravel 4.1.30). - person nexus-bytes; 26.06.2014
comment
по состоянию на 16.01.2017 я действительно смог получить имя таблицы внутри модели через self::getTable(). Ларавель 5.5. - person curveball; 16.01.2018

person    schedule
comment
Спасибо за помощь. Я пробовал это как с установкой имени таблицы вручную, так и без нее. Я продолжаю использовать $this, когда не в контексте объекта. Есть идеи? Спасибо! - person Chris G; 29.12.2012
comment
Chris G: вы можете скопировать/вставить сюда свой код, так как ошибка, которую вы получаете, выглядит так, как будто вы вызываете $this внутри статического метода - person Miro; 30.12.2012
comment
Я думаю, что в красноречивой модели уже есть функция getTable(). Кроме того, нет смысла копировать и вставлять одну и ту же функцию в дочерние классы. Если защищенному свойству не хватает функции-оболочки (а в данном случае ее нет), используйте трейт. - person Jed Lynch; 25.04.2019
comment
@JedLynch - этот ответ был в 2012 году, задолго до того, как эта функция существовала в Laravel. Я отредактирую его, чтобы указать, что это старый ответ. - person Laurence; 26.04.2019