我正在将数据库从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.
答案 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;
}