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

时间:2012-12-29 14:40:00

标签: laravel eloquent

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

13 个答案:

答案 0 :(得分:40)

泰勒对你的问题有一个answer

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

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

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

class BaseModel extends Eloquent {

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

}

class User extends BaseModel {

}


User::getTableName();

答案 1 :(得分:31)

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

答案 2 :(得分:9)

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

是 - 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());
});

答案 3 :(得分:4)

就我而言,我正在使用laravel 5.4

return (new static)->getTable();

答案 4 :(得分:4)

基于Lucky Soni answer,如果您想直接从 Vontroller View 调用它,还有另一个简单的技巧。

如果您是讨厌单行实例声明的“单行程序员” ,则在Laravel 6中进行了测试,并且我一直在使用它。在模型文件中也不需要多余的行。

$string_table_name = with(new \App\Model\TableModelName)->getTable();

或者更好的是,您也许也可以直接致电

$string_table_name = (new \App\Model\TableModelName)->getTable();

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

编辑:

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

with()本身是Laravel帮助函数,它返回该类的对象。在扩展Model的内部类中,已经具有功能getTable()。因此,您不必在模型类中放置另一个新的冗余函数。 似乎是最新版本,您可以直接调用(new Class),而无需使用with()函数。

这个答案和Lucky答案之间的区别是,我并没有在Model类内创建任何新函数来获取表名,即使您可以在Controller和View内部调用该函数而无需声明模型类的对象。是为了美化代码。

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

答案 5 :(得分:2)

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

以下是一个案例:

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

答案 6 :(得分:1)

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

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

$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 :(得分:1)

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

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

别忘了更换:

\ App \ User

带有模型路径。

答案 8 :(得分:1)

基于裁缝奥特威尔(Otwell)的answer,您可以使用类似这样的内容:

with(new Model)->getTable();

注意:已在5.x,6.x,7.x,8.x版上进行测试,并且效果很好。

答案 9 :(得分:1)

另一种解决方案是像这样使用 resolve 助手:

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

答案 10 :(得分:0)

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

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

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

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

答案 11 :(得分:0)

这是另一种方法,您可以静态获取模型的表名。

  1. 定义特征:app/Traits/CanGetTableNameStatically.php
<?php namespace App\Traits;

trait CanGetTableNameStatically
{
    public static function tableName()
    {
        return with(new static)->getTable();
    }
}
  1. 使用 Model 语句扩展所需的 BaseModeluse

app/Models/BaseModel.php

<?php namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use App\Traits\CanGetTableNameStatically;

class BaseModel extends Model
{
    use CanGetTableNameStatically;

    // ...
}

在你的模型上,如果你在 Laravel 的保留属性上设置自定义表名:protected $table 那么它仍然可以工作并返回正确的表名。

app/Models/Customer.php

<?php namespace App\Models\Master;

use App\Models\BaseModel;

class Customer extends BaseModel
{
    protected $table = 'my_customers';

    // ...
}

用法:只需在任何地方调用 YourModel::tableName()

在视图中:

{{ \App\Models\Customer::tableName() }}

在进行连接时:

DB::table( Product::tableName() . ' AS p' )
->leftJoin( ProductCategory::tableName() . ' AS pc', 'pc.id', '=', 'p.category_id')
// ... etc

注意: 我在需要但完全公开的情况下使用这种方法,我找到了另一个具有完全相同方法的答案 here,因此我复制粘贴到此处以供参考,感谢 @topher

答案 12 :(得分:-3)

Laravel 4 中使用静态方法

$table_name = Model::getTable();
在Eloquent Model

中的

或“ self

$table_name = self::getTable();