我想为我的会话数据库使用不同的表前缀。所以,在我的配置文件中,我的表前缀设置为“pre1_”,但我希望我的会话使用前缀为“pre2_”的表——这可能吗?
谢谢。
我在我的模型中注释了这条线,所以它不会被执行;
// 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()
对于 Cakephp 2.1 中的“公司”前缀 - 模型中的公共 $tablePrefix 并在控制器中设置 tablePrefix ,这就是我正在做的事情,它的代码行太多(每个表有一行代码,每个表都有一个前缀用户)但这是我现在能做的。
模型.php:
public $tablePrefix = 'anything_';
模型b.php:
public $tablePrefix = 'anything_';
模型c.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').'_'; }
我没有以这种方式收到“重载属性”错误,但在我的架构中,我所有的用户都有一个有效的公司代码。例如,我还为所有用户共享了“用户”表(尽管只有管理员可以访问登录用户以外的用户记录)
但是,我发现这相当麻烦,并且对不需要将模型的 $tablePrefix company_code 设置隔离的每个模型都定义为 AppController 中的一行代码的方法感兴趣。我真正想为模型设置 tablePrefix 的点是我引用的那一刻
$this->loadModel("Modelb");
但是我花了 45 分钟在 Model 目录中使用 modelb.php 并且无法使用 $tablePrefix 属性做很多事情。当模型被实例化或引用时,我应该知道,对于那些需要 $tablePrefix 属性的表,所需的前缀,但我当时无法动态设置属性。(动态静态属性?听起来像是错误的方法)
所以,即使这有效,我也不喜欢它。感觉就像我在 Lisp 程序中使用 Fortran 方法一样。
在 ModelasController.php 中:
$this->loadModel("Modelb");
$this->Modelb->tablePrefix = $this->Auth->user('company_code');
是使用第二个公司编码模型的正确方法,我不需要 beforeFind 逻辑。
所以只有 AppController 对 beforeFilter 中的每个可能的模型都有一行来设置 tablePrefix,就像上面一样,使用 php 函数 isset 来检测模型。
但是,当我使用 loadModel 将辅助模型拉入控制器时,我现在立即通过将 tablePrefix 设置为公司代码来遵循这一点,我可以在控制器中访问它。这会进入模型对象并覆盖 tablePrefix 静态属性。
我最终将database.php
配置文件中的前缀更改为我希望会话表具有的前缀,然后在每个模型中将$table_prefix
属性设置为所需的前缀。看起来有点奇怪,但它完成了工作。