【问题标题】:Laravel Query builder and table namesLaravel 查询构建器和表名
【发布时间】:2016-12-26 10:55:32
【问题描述】:

我注意到,当我使用查询生成器时,我在不同的文件中写了很多数据库表名。如果我要更改数据库表名,我将不得不在我的项目中搜索和更改相当多的行。 这是您的 Laravel 人员注意到并提出解决方案的问题吗?

我喜欢使用类模型而不是数据库名称的 Eloquent 方法;但对于某些查询,我认为查询生成器是更好的解决方案(尽管我不是这方面的专家)。

【问题讨论】:

    标签: laravel database-table laravel-query-builder


    【解决方案1】:

    在您的查询中使用它:

    (new YourModel())->getTable()
    

    例子:

    DB:raw('SELECT * FROM '.(new User())->getTable().' WHERE id=3');
    

    【讨论】:

    • 有趣。不使用 raw 可以做到这一点吗?
    • 是的,这段代码只是获取表名,你可以在任何地方使用它,这比添加更多代码更容易我认为这是一个比其他答案更好的解决方案。
    • 有时您没有模型。例如,如果您已经构建了一个系统(例如 magento)。现在你想使用它的数据库,你不能做一个模型,因为表格不会妨碍你,你只需要选择它。但是对于普通模型,您的解决方案对您来说是完美的 +1
    • 谢谢。如果可以,我会将两者都标记为正确答案。当一个问题可以有多个正确答案时,我不确定如何处理,在 stackOverflow 上。
    【解决方案2】:

    如何使用 OOP 概念。 Laravel 是一个框架,所以没有人会阻止你使用基本的 PHP OOP 概念。我就是这样做的:

    考虑我的查询是这样的:

    $result=DB::table('myTable')->select()->get();
    

    我要做的是创建一个包含所有表名的类:

    class TableName
    {
        private $tableName= "myTable";
        public function getTableName()
        {
            return $this->tableName;
        }
    
        public function setTableName($table_name)
        {
            $this->tableName = $table_name;
        }
    }
    

    现在我要做的就是使用文件中的对象调用一个方法,我想使用如下表:

    $name = new TableName() ;
    $result=DB::table($name->getTableName())->select()->get();
    

    随时随地使用。我不认为它是最好的解决方案,但它对我有用。希望对你有帮助

    【讨论】:

      【解决方案3】:

      也许你可以扩展模型类。

      CModel extend Model {
      
         protected static $tableName;
      
         public static getTableName(){
             if(static::$tableName)
                return static::$tableName;
      
             /* if you create a "reference break" you don't have to *
             /* create "protected static $tableName" row in your all model */
      
             $table = (new static())->getTable();
             return static::$tableName = &$table;
         }
      }
      
      YourModel extends CModel {...}
      

      你可以使用

      YourModel::getTableName()
      

      我没有更好的主意。

      【讨论】:

        【解决方案4】:

        如果你已经有一个 queryBuilder 对象,你可以像这样获取表名

        $tableName = $query->getModel()->getTable();

        【讨论】:

        • 这应该被接受为答案。它允许您在代码中的任何位置获取查询构建器的当前目标表,这非常有用。
        猜你喜欢
        • 1970-01-01
        • 2019-01-09
        • 2021-09-25
        • 2020-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-29
        相关资源
        最近更新 更多