如何在Laravel中返回数据库表名

如何在Laravel中返回数据库表名,laravel,eloquent,Laravel,Eloquent,有没有一种方法可以让我所在的模型使用当前的数据库表?我看到在Laravel/Database/Eloquent/model.php中有一个table()函数,但从我所在的模型中调用该函数失败。编辑2019年4月:此答案现已过时。请参阅Flyn San的新正确答案 是-Eloquent有一个$table变量。有两种方法可以访问此文件: class yourModel extends Eloquent { public static $table = "differentTable

有没有一种方法可以让我所在的模型使用当前的数据库表?我看到在Laravel/Database/Eloquent/model.php中有一个table()函数,但从我所在的模型中调用该函数失败。

编辑2019年4月:此答案现已过时。请参阅Flyn San的新正确答案

是-Eloquent有一个
$table
变量。有两种方法可以访问此文件:

class yourModel extends Eloquent {

        public static $table = "differentTable";

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

然后在代码中

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

中定义了一个公共getTable()方法,因此您应该能够在Laravel 4中使用
$model->getTable()
使用静态方法

$table_name = Model::getTable();
或者在雄辩的模型中“自我”

$table_name = self::getTable();
泰勒对你的问题有个疑问:

在模型类中,可以执行以下操作:

return with(new static)->getTable();
class BaseModel extends Eloquent {

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

}

class User extends BaseModel {

}


User::getTableName();
with(new Model)->getTable();
如果希望所有模型都能够静态返回表名,那么如下所示:

return with(new static)->getTable();
class BaseModel extends Eloquent {

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

}

class User extends BaseModel {

}


User::getTableName();
with(new Model)->getTable();

由于
是模型类(Laravel>=5)中的受保护属性,因此需要模型的实例

以下是一个案例示例:

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

在我的例子中,我使用的是laravel 5.4


return(新静态)->getTable()

我只想为来自搜索引擎的人添加以下内容:

如果您甚至不想实例化模型(更快?):

这可能看起来很难看,但这正是getTable()方法在幕后解决它的方式,所以

您需要
使用light\Support\Str位于文件顶部

附录:暗示您遵循框架的标准(即:
Post
模型有
posts
表,用户模型有
users
表等)

基于此,如果您想直接从vocontroller视图调用它,还有一个简单的技巧

在Laravel6中进行了测试,如果您是讨厌额外的行实例声明的“单行程序员”,我会继续使用它。模型文件中也不需要额外的行

$string_table_name = with(new \App\Model\TableModelName)->getTable();
或者更好,你也可以称之为

$string_table_name = (new \App\Model\TableModelName)->getTable();
即使在模型类中重命名
$table
变量,它也将返回tabel名称的纯字符串

编辑:

负代表??也许您应该首先在控制器中尝试这一点,而不是在模型类中创建新函数,以获取表名,而无需在调用时声明对象

with()
本身就是返回类的对象的Laravel helper函数。在扩展模型的类中,已经有函数
getTable()
。所以,您不必在模型类中放置另一个新的冗余函数。 这似乎是最新的版本,您只需调用
(新类)
,而不必使用()调用
函数

这个答案和Lucky的答案的不同之处在于,我的答案没有在Model类中创建任何新函数来获取表名,即使您只需在控制器和视图中调用该函数,而无需声明Model类的对象。这是为了美化代码


Lucky的答案是在Model类中创建新函数,您需要从对象调用该函数。

您可以通过以下代码以静态方式获取模型表的名称:

如果我们有一个模型作为ModelName:

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

如果自定义表名是由模型中的
protected$table='custom\u table\u name'
定义的,则此方法也可以正常工作。

通过以下方法从Laravel模型获取表名的简单方法:

$tableName = app(\App\User::class)->getTable();
不要忘记更换:

\应用程序\用户

使用模型路径。

基于tailor Otwell的,您可以使用以下内容:

return with(new static)->getTable();
class BaseModel extends Eloquent {

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

}

class User extends BaseModel {

}


User::getTableName();
with(new Model)->getTable();

注意:在5.x、6.x、7.x、8.x版本上进行了测试,效果良好。

另一种解决方案是使用
解析
帮助程序,如下所示:

resolve('\\App\\Models\\User')->getTable()

谢谢您的帮助。我尝试过手动设置表名和不设置表名。我不断得到“当不在对象上下文中时使用$this”。有什么想法吗?谢谢Chris G:你能在这里复制/粘贴你的代码吗?因为你得到的错误看起来像是在一个静态方法中调用$this。我认为在这个雄辩的模型中已经有了一个getTable()函数。除此之外,在子类中复制和粘贴相同的函数是没有意义的。如果受保护的属性缺少函数包装器(在本例中它没有),请使用trait。@JedLynch-这个答案是在2012年,远远早于Laravel中存在该函数。我将对其进行编辑,指出这是一个旧答案。getTable()函数似乎不是静态的-您需要模型的一个实例来获取表:
$model=newmodel()$表_name=$model->getTable()(我使用的是Laravel 4.1.30)。截至2017年1月16日,我实际上能够通过
self::getTable()
在模型中获取表名。Laravel 5.5.对于Laravel 5.3,您必须将其放在照明\数据库\雄辩\模型中,工作正常,谢谢!千万不要那样做@Santee。永远不要更改
供应商
文件夹中的文件。您是rigth Tanmar。谢谢。我在这里看不到使用
的好处。@poring91为什么
和(新静态)
(新静态)
更好?只要您没有覆盖table变量以在模型中使用不同的表,这就可以工作。我认为这绝对不是正确的方法。基于模型的类名假设过多很可能会遇到问题。正如Ludwig所指出的,如果你覆盖了表变量,这是行不通的。你们似乎都忽略了附录。只有当你有模型的实际实例时,这才有效。当作为静态函数调用时,它不起作用。@Robert它调用的是实例方法,而不是静态方法,因此无法推断静态方法是否存在。您不必拥有实例。你可以