有没有办法让我可以通过我所在的模型使用当前数据库表?我看到Laravel / Database / Eloquent / model.php中有一个table()函数,但是我没有成功调用它从我所在的模型中调用它。
答案 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)
这是另一种方法,您可以静态获取模型的表名。
app/Traits/CanGetTableNameStatically.php
<?php namespace App\Traits;
trait CanGetTableNameStatically
{
public static function tableName()
{
return with(new static)->getTable();
}
}
Model
语句扩展所需的 BaseModel
或 use
。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();