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

Chr*_*s G 21 laravel eloquent

有没有办法让我可以通过我所在的模型使用当前数据库表?我看到Laravel/Database/Eloquent/model.php中有一个table()函数,但是我调用它从我所在的模型中调用它是不成功的.

Fly*_*San 50

Eloquent\Model中定义了一个公共getTable()方法,因此您应该可以使用$model->getTable().

  • 你不必有一个实例。你可以做`app(Model::class)->getTable();` (10认同)
  • 对于每个阅读此页面的人来说,这都是正确的答案。 (5认同)
  • @sabertabatabaeeyazdi `Model::class` 只是一个字符串。您可以在命令行中传递它并使用该变量。例如 `app($modelClass)->getTable()`。但它必须包含名称空间。 (3认同)
  • @iSWORD 你必须有一个实例。您正在使用“app()”创建一个。 (3认同)
  • 好吧,这似乎只有在您拥有模型的实际实例时才有效。当作为静态函数调用时它不起作用。 (2认同)
  • getTable() 不包含任何表前缀(如果您使用的话)。 (2认同)

Luc*_*oni 43

泰勒对你的问题有一个答案:

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

return with(new static)->getTable();
Run Code Online (Sandbox Code Playgroud)

如果您希望所有模型都能够静态返回表名,那么就像这样:

class BaseModel extends Eloquent {

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

}

class User extends BaseModel {

}


User::getTableName();
Run Code Online (Sandbox Code Playgroud)

  • 千万不要@Santee。永远不要更改“ vendor”文件夹中的文件。 (4认同)
  • 我认为在这里使用“with”并没有什么好处。 (4认同)
  • @poring91 为什么 `with(new static)` 比 `(new static)` 更好?https://laravel.com/docs/5.7/helpers#method-with (2认同)

sya*_*lal 12

它将返回模型中的表名称。在 Laravel 8 上完美运行

app(Modelname::class)->getTable()
Run Code Online (Sandbox Code Playgroud)

您必须将 Modelname 替换为您的模型类


Lau*_*nce 11

是的 - Eloquent有一个$table变量.有两种方法可以访问它:

class yourModel extends Eloquent {

        public static $table = "differentTable";

        function someFunction()
        {
             return yourModel::$table;
        }
}
Run Code Online (Sandbox Code Playgroud)

要么

class yourModel extends Eloquent {

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

    }
}
Run Code Online (Sandbox Code Playgroud)

然后在你的代码中

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


Lor*_*uer 6

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

下面是一个案例:

        DB::table( (new YourModelClassname)->getTable() )
            ->update(['field' => false]);
Run Code Online (Sandbox Code Playgroud)


sh6*_*210 6

In my case, i'm using laravel 5.4

return (new static)->getTable();


por*_*g91 5

根据Lucky Soni 的回答,如果您想直接从VontrollerView调用它,还有另一个简单的技巧。

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

$string_table_name = with(new \App\Model\TableModelName)->getTable();
Run Code Online (Sandbox Code Playgroud)

或者更好,你也可以直接调用它

$string_table_name = (new \App\Model\TableModelName)->getTable();
Run Code Online (Sandbox Code Playgroud)

即使您$table在模型类中重命名变量,它也会返回表名称的纯字符串。

编辑 :

减去代表??也许您应该首先在控制器中尝试此操作,而不是在模型类中创建新函数只是为了获取表名称,而无需在调用时声明对象。

with()它本身是 Laravel 辅助函数,返回类的对象。在扩展 Model 的类内部,已经具有 function getTable()。因此,您不必在模型类中放置另一个新的冗余函数。好像是最新版本,只能调用,(new Class)没有with()功能。

这个答案和Lucky的答案之间的区别是,我的答案没有在模型类中创建任何新函数来获取表名,即使你可以只调用控制器和视图中的函数而不声明模型类的对象。是为了美化代码。

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


BAB*_*AFI 5

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

如果我们有一个 Model 作为 ModelName:

ModelName::query()->getQuery()->from
Run Code Online (Sandbox Code Playgroud)

protected $table = 'custom_table_name'在模型中定义的自定义表名的情况下,此方法也可以正常工作。