簡體   English   中英

Cakephp模型忽略數據庫設置

[英]Cakephp Model ignoring database settings

更新:請參閱下面的“編輯”部分,其中解釋了測試后發現的內容

我正在使用CakePHP 2.5.1在網站上,和我遇到一個很奇怪的現象:2個模型我有一個 似乎拒絕使用不同的數據庫配置(而不是默認的),如果我不”請將其放置在Cake的默認“ 模型”文件夾中(如果在該文件夾中,一切正常)。

兩種模型都位於同一文件夾中,該文件夾恰好不是默認的“模型”文件夾 (這是因為它們與其他網站共享,並且我將所有共享的文件放在一個中央位置)。

為了使Cake找到那些模型,我在bootstrap.php文件中使用以下代碼行: App::build(array('Model' => array(dirname(ROOT) . DS . '_shared/Cake_v2/Model')));

我在那兒擁有的2個模型分別是CampanyaEjercicioMultChoice

一切似乎都已正確設置:

  • 如果我打印App::objects('Model')我會看到那里列出的兩個模型,這意味着Cake在該外部文件夾中找到了它們。
  • 如果我打印get_class_vars('DATABASE_CONFIG') ,則可以看到兩種數據庫配置: Campanya使用的默認數據庫配置和EjercicioMultChoice使用的自定義配置數據庫(稱為BD_Contenidos )。
  • 兩種模型都包含在AppController.php中,並帶有$uses變量數組。

我可以在控制器中調用Campanya模型,沒有任何問題。 但是,當調用EjercicioMultChoice模型時,出現以下錯誤:

MISSING DATABASE TABLE
Error: Table ejercicio_mult_choices for model EjercicioMultChoice was not found in datasource default.

這就是EjercicioMultChoice模型文件的樣子:

class EjercicioMultChoice extends AppModel {

public $name = 'EjercicioMultChoice';
public $primaryKey = 'id';
public $useTable = 'ejercicios_multiple_choice';
public $useDbConfig = 'BD_Contenidos'; 
}

如您所見,該模型指示使用Cake知道的特定數據庫配置,但是在上面顯示的錯誤中,它表示無法在數據源default中找到該表。 當然不能,因為它不存在,它在另一個數據庫的另一個表中(順便說一下,另一個數據庫與默認數據庫位於同一服務器中,而我在其他項目上使用它時都沒有問題)。

正如我上面提到的,如果我將完全相同的EjercicioMultChoice.php模型文件移動到Cake的默認app / Model /文件夾中,那么我沒有任何問題。

所以我在這里有點迷失了,我不知道還有什么可以檢查以找出問題所在。

編輯

因此,我相信我已經找到了問題所在,並找到了解決方法,但我仍然想知道為什么會發生這種情況,以及如何使它正常工作。

如果我在調用模型之前添加了這兩行代碼( 兩者 ),那么一切都很好:

$this->EjercicioMultChoice->setDataSource('BD_Contenidos');
$this->EjercicioMultChoice->setSource('ejercicios_multiple_choice');

顯然,這意味着即使Cake找到了指示數據庫和表名稱的EjercicioMultChoice.php模型文件,它仍會忽略這兩個變量( $ useTable$ useDbConfig )。 使其工作的唯一方法是使用我上面編寫的方法手動設置這兩個變量。

為什么會這樣呢? 如果模型文件位於默認文件夾中,則不會發生這種情況。

好吧,好吧,看來問題是我沒有在App :: build()路徑中添加尾隨/ 正確的應該是App::build(array('Model' => array(dirname(ROOT) . DS . '_shared/Cake_v2/Model/')));

使我很難弄清楚的是,即使沒有后綴/ ,Cake仍在該文件夾中實際上找到了模型,但由於某種原因,阻止了它加載那些模型文件的內部內容。

無論如何,現在就可以使用!

據我所知,cake沒有加載您提供的模型文件! 您可以通過添加一個exit();來找出答案exit(); 在該(共享)文件的第一行中調用,以查看您的應用是否支持該操作(通過顯示白頁,-)。

否則,cakephp將不會拾取您的模型文件。

檢查模型文件是否被拾取的另一種方法是定義一個自定義成員變量,例如public $myModelTestVar = 'sharedModel'; 到文件,然后在使用模型的控制器中檢查變量(只需在操作中debug($this->EjercicioMultChoice) )。

如果您可以確認/證明文件已被拾取,我將自願設置此方案並嘗試自己發生的事情-但可以肯定的是,我是對的。

debug(dirname(ROOT) . DS . '_shared/Cake_v2/Model')

證明它指向您的期望。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM