【问题标题】:Can I get the name of the model class by the table name?我可以通过表名获取模型类的名称吗?
【发布时间】:2015-10-07 12:23:54
【问题描述】:

假设我有这个 Eloquent 模型类:

class Fruit extends Model
{
    //whatever not following the conventions
    protected $table = 'the_fruit_table'; 
}

在我的代码中,我有一个带有表名的变量

$table_name = 'the_fruit_table';

有没有办法获得负责该表的模型的名称? 所以在这种情况下,我会得到字符串:

'\App\Fruit'

【问题讨论】:

    标签: php laravel model eloquent


    【解决方案1】:

    如果您遵循 laravel 命名约定,您可以尝试以下方法

    $class = '\YourModelsNamespace\' . studly_case(str_singular($table))
    

    【讨论】:

    • 即使我不遵循命名约定,我也需要获取模型的名称。我已经相应地编辑了我的问题。谢谢!
    • 以上应该适用于更新的表名,只要您的模型名称是单数并且使用 studly 大小写。例如。 the_fruit_table => TheFruitTable, my_tables => MyTable, tables => Table,
    • 如果您遵循任何其他命名约定,请告诉我是否可以对其进行编辑以匹配您的。
    【解决方案2】:

    如果您使用默认命名系统,您可以像这样获取类名:

    $class = 'App\\'.ucwords(rtrim(camel_case($table_name),'s'));
    

    然后检查类是否存在:

    if(class_exists($class)){
        //do something
    }
    

    最后你可以这样使用它:

    $result = $class::all()
    

    【讨论】:

    • 即使我不遵循命名约定,我也需要获取模型的名称。我已经相应地编辑了我的问题。谢谢!
    【解决方案3】:

    技术上是可能的:

    $className = \Propel::getDatabaseMap()->getTable('the_fruit_table')->getClassName();
    

    但是:

    1) FruitPeer 必须已经(自动)加载,因为在 BaseFruitPeer 的末尾有一条神奇的线:

    BaseFruitPeer::buildTableMap();
    

    2) 此示例假设您使用的是默认数据库。如果不是,则必须将其输入 getDatabaseMap()。

    Propel 充满了惊喜。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多