当前位置: 首页 > 工具软件 > RedBeanPHP > 使用案例 >

php redbean update,redbeanphp和表前缀

严安志
2023-12-01

我在我的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

 类似资料: