我在我的 php 项目中使用 Redbeanphp ( http://redbeanphp.com/ )。我想为我的表使用表前缀。

Redbeanphp 从 3.0 版本开始不支持表前缀。但我想扩展 Redbeanphp 以支持我的项目中的表前缀。

我不想修改 redbeanphp 代码。但如果没有解决方案,我会这样做。

我已经尝试替换 Redbeanphp 的 QueryWriter 但 QueryWriter 类并不总是相同的(这取决于我的数据库类型)。

最好的方法是什么?

最佳答案

我现在得到了回应,所以我回答自己。

一旦 redbean 被初始化,你就可以配置一个新的工具箱。 redbean 中的工具箱处理 3 个重要对象:查询编写器、Redbean OODB 和数据库适配器。您可以使用 R::$toolbox 访问当前的 redbean 工具箱

您可以执行以下代码:

R::configureFacadeWithToolbox(new RedBean_ToolBox(R::$redbean, R::$adapter, R::$writer));

这段代码什么都不做。因为您使用新工具箱配置 Redbean,但使用相同的 OODB、相同的数据库适配器和相同的查询编写器。但是在这段代码中,您可以用您自己的对象替换这些对象之一。

例如,用虚拟作家替换作家:
$writer = new MyQueryWriter();
R::configureFacadeWithToolbox(new RedBean_ToolBox(R::$redbean, R::$adapter, $writer));

问题如下:
  • 您想用自己的查询编写器替换查询编写器来处理表前缀
  • 查询编写器类并不总是相同的。 Redbean 使用 5 个类作为查询编写器。该类取决于数据库类型。例如,如果您使用 Mysql 数据库,则查询编写器类是 RedBean_QueryWriter_MySQL
  • 您不想编写整个查询编写器。

  • Redbean 查询编写器可能的类是:
  • RedBean_QueryWriter_CUBRID
  • RedBean_QueryWriter_MySQL
  • RedBean_QueryWriter_Oracle
  • RedBean_QueryWriter_PostgreSQL
  • RedBean_QueryWriter_SQLiteT

  • 所以,这是我的解决方案。我写了 5 个小类。
    class MyCubridQueryWriter extends RedBean_QueryWriter_CUBRID {
    
       public function safeTable($name, $noQuotes = false) {
          $name = prefix($name);
          return parent::safeTable($name, $noQuotes);
       }
    
    }
    
    class MyMysqlQueryWriter extends RedBean_QueryWriter_MySQL {
    
       public function safeTable($name, $noQuotes = false) {
          $name = prefix($name)
          return parent::safeTable($name, $noQuotes);
       }
    
    }
    
    class MyOracleQueryWriter extends RedBean_QueryWriter_Oracle {
    
       public function safeTable($name, $noQuotes = false) {
          $name = prefix($name)
          return parent::safeTable($name, $noQuotes);
       }
    
    }
    
    class MyPostgreSqlQueryWriter extends RedBean_QueryWriter_PostgreSQL {
    
       public function safeTable($name, $noQuotes = false) {
          $name = prefix($name)
          return parent::safeTable($name, $noQuotes);
       }
    
    }
    
    class MySQLiteTQueryWriter extends RedBean_QueryWriter_SQLiteT {
    
       public function safeTable($name, $noQuotes = false) {
          $name = prefix($name)
          return parent::safeTable($name, $noQuotes);
       }
    
    }
    

    如您所见,每个类都扩展了一个 Redbean 查询编写器类。我们覆盖了 safeTable 方法。 Redbean 总是在表名上使用 safeTableprefix 函数很简单:
    function prefix($table) {
        return "my_prefix_$table";
    }
    

    所以现在,在我们的代码中。我们可以使用数组将 Redbean 查询编写器类映射到我们自己的类并替换它。我们到了 :
    $writerMapping = array(
        'RedBean_QueryWriter_CUBRID' => 'MyCubridQueryWriter',
        'RedBean_QueryWriter_MySQL' => 'MyMysqlQueryWriter',
        'RedBean_QueryWriter_Oracle' => 'MyOracleQueryWriter',
        'RedBean_QueryWriter_PostgreSQL' => 'MyPostgreSqlQueryWriter',
        'RedBean_QueryWriter_SQLiteT' => 'MySQLiteTQueryWriter'
    );
    
    $class = $writerMapping[get_class(R::$writer)];
    $writer = new $class(R::$adapter);
    
    R::configureFacadeWithToolbox(new RedBean_ToolBox(R::$redbean, R::$adapter, $writer));
    

    等等。现在 Redbean 将使用您自己的编写器,您可以为所欲为!使用我们的 safeTable 方法,我们为数据库中的每个表名添加一个前缀。

    10-08 07:14