Laravel 查询构建器和表名

9
我注意到在使用查询构建器时,我经常需要写数据库表名,并且在不同的文件中都需要。如果我要更改数据库表名,我将不得不搜索并更改项目中相当多的行。
Laravel开发者是否意识到这个问题并提出了解决方案?
我喜欢Eloquent方法,它使用类模型而不是数据库名称;但对于一些查询,我认为查询构建器是更好的解决方案(尽管我在这方面不是专家)。
4个回答

14
如果您已经有一个queryBuilder对象,您可以使用以下代码获取表名称:
``` $tableName = $query->getModel()->getTable(); ```
该代码片段会从查询对象中提取模型并返回与该模型关联的数据表名称。

1
这应该被接受为答案。它允许您在代码中的任何位置获取查询构建器的当前目标表,非常有用。 - le hien

9

在您的查询中使用此语句:

(new YourModel())->getTable()

例子:

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

有趣。这能在不使用原始数据的情况下完成吗? - Olof84
是的,这段代码只是获取表名,你可以在任何地方使用它,比添加更多代码更容易。我认为这是比其他答案更好的解决方案。 - neoteknic
有时候你没有一个模型。例如,如果你已经构建了一个系统(例如magento)。现在你想使用它的数据库,你不能制作一个模型,因为表格不是通过这种方式生成的,你只需要选择它。但对于一个普通模型,你的解决方案是完美的,+1给你。 - Aditya Singh
1
谢谢。如果可以的话,我会将两个都标记为正确答案。我不太确定在 Stack Overflow 上如何处理一个问题可能有多个正确答案的情况。 - Olof84

1

使用面向对象编程(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();

随意使用。我不认为这是最好的解决方案,但它对我有用。希望能帮到你。


0
也许你可以扩展这个模型类。
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()

我没有更好的想法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接