有没有办法让我可以通过我所在的模型使用当前数据库表?我看到Laravel/Database/Eloquent/model.php中有一个table()函数,但是我调用它从我所在的模型中调用它是不成功的.
Fly*_*San 50
在Eloquent\Model中定义了一个公共getTable()方法,因此您应该可以使用$model->getTable()
.
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)
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)
由于table
是模型类中的受保护属性(Laravel >= 5),您将需要模型的实例。
下面是一个案例:
DB::table( (new YourModelClassname)->getTable() )
->update(['field' => false]);
Run Code Online (Sandbox Code Playgroud)
根据Lucky Soni 的回答,如果您想直接从Vontroller或View调用它,还有另一个简单的技巧。
在 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 类中创建新函数,但您需要从对象中调用该函数。
您可以通过以下代码以静态方式获取模型表的名称:
如果我们有一个 Model 作为 ModelName:
ModelName::query()->getQuery()->from
Run Code Online (Sandbox Code Playgroud)
protected $table = 'custom_table_name'
在模型中定义的自定义表名的情况下,此方法也可以正常工作。
归档时间: |
|
查看次数: |
46642 次 |
最近记录: |