【问题标题】:Can a CakePHP model change its table without being re-instantiated?CakePHP 模型可以在不重新实例化的情况下更改其表吗?
【发布时间】:2009-10-01 19:57:18
【问题描述】:

我正在使用一个不可更改的遗留数据库架构,其中对象的每个实例在数据库中都有自己的表以及关联的记录。每次实例化模型时,我都需要更改模型的useTable,但要保留 Cake 的良好缓存等。

假设我有很多 pad 对象,每个都有几个 note 对象(Note belongsTo Pad, Pad hasMany Note)。每个 pad 在 pads 表中都有一条记录,但是每个音符在数据库中都有自己的表(比如标题为“pad_{id}”)。这个模式是固定的,我必须使用它。

现在我不需要做任何保存,所以我在模型的 before find 中这样做以支持阅读:

function beforeFind($query_data) {
    if(empty($query_data['pad_id'])) {
        return false;
    } else {
        $this->useTable = $query_data['pad_id'];
        parent::__construct();
        return $query_data;
    }

}

这会更改数据库中使用的模型表,并且在Core::debug > 0 时可以正常工作。但是,当它为零时,我认为 CakePHP 会缓存模型代码并且不会正确更改表。无论如何,当我访问 /pads/view/{pad_id} 或任何动态更改此表的操作时,我都会收到 404 错误。我无法弄清楚确切的错误是什么,因为当我打开调试时它工作正常。因此,有关调试此问题的任何指示也会有所帮助。

谢谢!

【问题讨论】:

标签: php cakephp cakephp-model


【解决方案1】:

您应该能够使用setSource() 来更改模型正在使用的表。 $this->setSource('pad_x') 会将表设置为 'pad_x' 并重置模型的架构。 API reference

【讨论】:

  • 马克故事,你做的很棒。
【解决方案2】:

在您的控制器或 AppController 中尝试var $persistModel = false;

见:http://www.pseudocoder.com/archives/2009/03/17/8-ways-to-speed-up-cakephp-apps/

【讨论】:

  • 一个很好的临时解决方案,但是我不想缩短模型持久性,我想用它来显着提高性能,只需更改所有查询中使用的表。我想我可能需要修改基础模型类,但这对我来说听起来不太像 Cake。
  • 你可以在扩展模型行为时做到这一点!
猜你喜欢
  • 1970-01-01
  • 2011-03-30
  • 1970-01-01
  • 2017-01-31
  • 1970-01-01
  • 2015-11-18
  • 1970-01-01
  • 2011-07-06
  • 1970-01-01
相关资源
最近更新 更多