我在我的php项目中使用Redbeanphp(http://redbeanphp.com/).我想为我的表使用表前缀.
自版本3.0以来,Redbeanphp不支持表前缀.但我想扩展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总是在表名上使用safeTable.前缀功能很简单:
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方法,我们为数据库中的每个表名添加一个前缀.
标签:php,orm,redbean
来源: https://codeday.me/bug/20190529/1180157.html