在数据源中找不到模型表

时间:2014-03-20 12:25:07

标签: php mysql cakephp cakephp-appmodel

我正在将数据库从SQL转储管理转换为由架构和迁移管理。部分原因是播种数据。我基于CakePhp's page about Schemas上的架构示例来完成我正在做的事情。

奇怪的是,第一个用数据播种的表没有问题,第二个表失败,出现Table users for model User was not found in datasource default之类的错误。即使我更改了将播种哪个表,也会发生这种情况:第一个表成功(我已经在数据库中检查了数据是否存在),而下一个要播种的表失败。

我还检查了针对数据库的错误消息,并且它抱怨的每个表都不存在确实存在。

我的'schema.php'看起来像这样:

class AppSchema extends CakeSchema {
public function before($event = array()) {
    return true;
}

private function create_many($class_name, $entries){  
  App::uses('ClassRegistry', 'Utility');
  $class = ClassRegistry::init($class_name);
  foreach($entries as $entry){
    $class->create();
    $class->save(array($class_name => $entry));
  }
}

private function create_many_kv($class_name, $keys, $values_matrix){
  $entries = array();
  foreach($values_matrix as $values){
    array_push($entries, array_combine($keys, $values));
  }
  $this->create_many($class_name, $entries);
}

public function after($event = array()) {
  if (isset($event['create'])) {
    switch ($event['create']) {
      case 'users':
        $this->create_many('User', array(
          array('emailaddress' => 'email',
                'password' => 'hash',
                'role_id' => 1
               ),
          array('emailaddress' => 'email2',
                'password' => 'hash',
                'role_id' => 3)
          ));
        break;
      case 'other_table':
        $this->create_many('OtherTable', array(
          array('id' => 1,
                'name' => 'datum'),
          array('id' => 2,
               'name' => 'datum2')
        ));
        break;

etc.

2 个答案:

答案 0 :(得分:1)

这里的答案是在创建最后一个表之后填充所有表。

我最好的假设是,为什么这不能像问题中描述的那样工作,Cake正在缓存内存中的数据库结构,并且在添加新表时不会更新。我找不到任何关于清除结构缓存的文档,因此解决方法现在最接近解决方案。

答案 1 :(得分:0)

将数据插入多个表时,您需要在创建每个表后刷新数据库缓存。可以通过在before action()中设置$db->cacheSources = false来禁用缓存。

public $connection = 'default';

public function before($event = array()) {
    $db = ConnectionManager::getDataSource($this->connection);
    $db->cacheSources = false;
    return true;
}