如何从 Eloquent 模型中静态获取表名?

Posted

技术标签:

【中文标题】如何从 Eloquent 模型中静态获取表名?【英文标题】:How can I get table name, statically from Eloquent model? 【发布时间】:2019-01-29 12:31:20 【问题描述】:

现在我有这段代码可以检查 Eloquent 模型连接到哪个表。

$s = new Something();
dd($s->getTable());

无论如何我可以在不实例化新的Something 对象的情况下获取表格吗?

我在想这些代码:

Something::getTable();

但是会有..should not be called statically的错误。

【问题讨论】:

你可以看这里:php.net/manual/fr/language.oop5.static.php (new static)->getTable() @Inazo 这与 PHP 中静态的(法语?)文档无关。 问题是可用于为模型指定自定义表名的$table 变量不是静态的,因此您无法静态访问它。这很奇怪,但也是设计使然。 (在表名下阅读eloquent model conventions) 我为this question 写了一个答案,也回答了你的问题。此外,您可以通过这种方式调用静态函数来获取表名。无需制作对象。 【参考方案1】:

您可以添加到您的模型中。

public static function getTableName()

    return (new self())->getTable();

然后你可以用Something::getTableName()获取表名

【讨论】:

如果您想在实际模型扩展的父模型中定义 getTableName()get_called_class() 会很有帮助。 ***.com/a/283094/470749 @Ryan 或 return (new static)->getTable() 在基本模型中。【参考方案2】:

$model = 新模型; 回声 $model->getTable(); 试试这个

【讨论】:

这正是他想要避免的,实例化新模型实例【参考方案3】:

不是静态而是优雅的方法

with(new Something)->getTable();

【讨论】:

【参考方案4】:
  class YourModel extends Model

    //

    public static $_table = "table_name";


然后像这样访问它

YourModel::$_table

【讨论】:

【参考方案5】:

这里稍作修改,以便您可以静态获取模型的表名。

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

trait CanGetTableNameStatically

    public static function tableName()
    
        return with(new static)->getTable();
    

    输入您的Model,或者更好的是,使用BaseModel,您的所有其他模型都扩展了它。

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

【讨论】:

+1 这是我在寻找答案并根据需要使用时自己想出的确切解决方案。 当它只被基本模型使用时,为什么要让它成为一个特征?

以上是关于如何从 Eloquent 模型中静态获取表名?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 laravel 的 eloquent 集合中获取外键

Laravel + Vue JS:从数据库中获取/存储 Eloquent 模型的值

Laravel Eloquent:如何从连接表中仅获取某些列

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

如何使用 Laravel eloquent 根据经纬度从 mongodb 获取位置?

为啥在 Eloquent 模型中调用方法时出现“不应静态调用非静态方法”?