我想为会话数据库使用不同的表前缀。因此,在我的配置文件中,我将表格前缀设置为“pre1_”,但我希望我的会话使用前缀为“pre2_”的表 - 这可能吗?
感谢。
答案 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
属性设置为所需的前缀。看起来有点奇怪,但它完成了工作。