redbeanphp和表前缀

Mag*_*gus 4 php orm redbean

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

自版本3.0以来,Redbeanphp不支持表前缀.但我想扩展Redbeanphp以支持我的项目中的表前缀.

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

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

最好的方法是什么?

Mag*_*gus 6

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

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

你可以这样做:

R::configureFacadeWithToolbox(new RedBean_ToolBox(R::$redbean, R::$adapter, R::$writer));
Run Code Online (Sandbox Code Playgroud)

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

例如,用虚拟编写器替换编写器:

$writer = new MyQueryWriter();
R::configureFacadeWithToolbox(new RedBean_ToolBox(R::$redbean, R::$adapter, $writer));
Run Code Online (Sandbox Code Playgroud)

探针如下:

  • 您希望用您自己的查询编写器替换查询编写器来处理表前缀
  • 查询编写器类并不总是相同的.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);
   }

} 
Run Code Online (Sandbox Code Playgroud)

如您所见,每个类都扩展了一个Redbean查询编写器类.我们覆盖了该safeTable方法.Redbean总是safeTable在表名上使用.该prefix功能很简单:

function prefix($table) {
    return "my_prefix_$table";
}
Run Code Online (Sandbox Code Playgroud)

现在,在我们的代码中.我们可以使用数组将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));
Run Code Online (Sandbox Code Playgroud)

瞧瞧.现在Redbean将使用你自己的作家,你可以做你想做的!使用我们的safeTable方法,我们为数据库中的每个表名添加一个前缀.