为cakephp会话数据库使用不同的表前缀

时间:2012-08-18 18:18:42

标签: php database session cakephp

我想为会话数据库使用不同的表前缀。因此,在我的配置文件中,我将表格前缀设置为“pre1_”,但我希望我的会话使用前缀为“pre2_”的表 - 这可能吗?

感谢。

4 个答案:

答案 0 :(得分:0)

我在模型中注明了这一行,所以它不会被执行;

//    public $tablePrefix = 'cc_';

然后,在我的AppController.php beforeFilter中我添加了

$this->modelname->tablePrefix=$this->Auth->user('company_prefix').'_';

在我的授权用户表中,我有一个名为company_prefix的字段,该字段位于该用户独有的某些表之前。

我希望在这个问题上看到更多。

我得到了很多'Indirect modification of overloaded property DifferentController::$Modelname has no effect'

所以我正在寻找一种方法,只有在添加模型或控制器的默认设置时才这样做。我不希望每个控制器都有beforeFilter(),所以我想我必须做某种isset()

答案 1 :(得分:0)

对于Cakephp 2.1中的'company'前缀 - 模型中的public $ tablePrefix并在控制器中设置tablePrefix,这是我正在做的,它是太多的代码行(每个表的一行代码有每个用户的前缀)但这是我现在所能做的全部。

Modela.php:

public $tablePrefix = 'anything_';

Modelb.php:

public $tablePrefix = 'anything_';

Modelc.php:

public $tablePrefix = 'anything_';

然后在AppController的公共函数beforeFilter()

if (isset($this->Modela->tablePrefix)) {$this->Modela->tablePrefix = $this->Auth->user('company_code').'_'; }
if (isset($this->Modelb->tablePrefix)) {$this->Modelb->tablePrefix = $this->Auth->user('company_code').'_'; }
if (isset($this->Modelc->tablePrefix)) {$this->Modelc->tablePrefix = $this->Auth->user('company_code').'_'; }

我没有以这种方式获得'重载属性'错误,但在我的架构中,我的所有用户都拥有有效的公司代码。我也有例如'users'表是为所有用户共享的(尽管只有管理员可以访问除登录用户之外的用户记录)

但是,我觉得这很麻烦,而且我对一种不需要将模型的$ tablePrefix company_code设置隔离的每个模型定义为AppController中的一行代码的方法感兴趣。我真正想要为模型设置tablePrefix的点是我的参考

$this->loadModel("Modelb"); 

但我花了45分钟在Model目录中使用modelb.php,并且无法对$ tablePrefix属性做太多工作。当一个模型被实例化或引用时,对于那些需要$ tablePrefix属性的表,我应该知道所需的前缀,但是我无法在那时动态设置属性。 (动态静态属性?听起来像是错误的方法)

所以,即使这样有效,我也不喜欢它。感觉就像我在Lisp程序中使用Fortran方法。

答案 2 :(得分:0)

在ModelasController.php中:

$this->loadModel("Modelb");
$this->Modelb->tablePrefix = $this->Auth->user('company_code');

是使用第二个公司编码模型的正确方法,我不需要beforeFind逻辑。

因此,只有AppController在beforeFilter中为每个可能的模型设置了一行来设置tablePrefix,就像上面一样,使用php函数isset来检测模型。

但是当我使用loadModel将辅助模型拉入控制器时,我立即通过将tablePrefix设置为公司代码来跟随它,我可以在控制器中找到它。这将进入模型对象并覆盖tablePrefix静态属性。

答案 3 :(得分:0)

我最终将database.php配置文件中的前缀更改为我希望我的会话表具有的前缀,然后在每个模型中将$table_prefix属性设置为所需的前缀。看起来有点奇怪,但它完成了工作。