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

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

Ответ 1

Изменить апрель 2019 года: этот ответ устарел. Смотрите новый правильный ответ Флин Сан

Да - Eloquent имеет переменную $table. Есть два способа получить к нему доступ:

class yourModel extends Eloquent {

        public static $table = "differentTable";

        function someFunction()
        {
             return yourModel::$table;
        }
}

или же

class yourModel extends Eloquent {

    public function someFunction()
    {
        return $this->table();

    }
}

тогда в вашем коде

Route::get('/', function () {
    $model = new yourModel();   
    dd($model->someFunction());
});

Ответ 2

Тейлор имеет ответ на ваш вопрос:

В классе модели вы можете сделать что-то вроде этого:

return with(new static)->getTable();

Если вы хотите, чтобы все ваши модели имели возможность возвращать имя таблицы статически, то вот что-то вроде этого:

class BaseModel extends Eloquent {

    public static function getTableName()
    {
        return with(new static)->getTable();
    }

}

class User extends BaseModel {

}


User::getTableName();

Ответ 3

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

Ответ 4

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

return (new static)->getTable();

Ответ 5

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

Вот пример:

        DB::table( (new YourModelClassname)->getTable() )
            ->update(['field' => false]);

Ответ 6

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

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

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

Ответ 7

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

$table_name = Model::getTable();

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

$table_name = self::getTable();