2013-02-17 5 views
0

У меня есть следующие модели:CakePHP Ошибка: Вызов функции члена находке() на не-объект

class Adjustment extends AppModel { 
    var $name = 'Adjustment';  
    var $belongsTo = array(
    'Source_Budget'=>array('className'=>'Budget','foreignKey'=>'s_budget_id'), 
    'Target_Budget'=>array('className'=>'Budget','foreignKey'=>'t_budget_id'), 
    'Source_Project'=>array('className'=>'Project','foreignKey'=>'s_project_id'), 
    'Target_Project'=>array('className'=>'Project','foreignKey'=>'t_project_id') 

); 

бюджетная модель и проект, как показано ниже

class Budget extends AppModel { 
var $name='Budget'; 
var $belongsTo = array('Year'); 
var $hasMany=array('Project','Payment','Revenue', 
'AdjustmentFrom'=>array('className'=>'Adjustment','foreignKey'=>'s_budget_id'), 
'AdjustmentTo'=>array('className'=>'Adjustment','foreignKey'=>'t_budget_id'), 
'TransferFrom'=>array('className'=>'Transfer','foreignKey'=>'s_budget_id'), 
'TransferTo'=>array('className'=>'Transfer','foreignKey'=>'t_budget_id') 
); 

class Project extends AppModel { 
    var $name = 'Project'; 
    var $belongsTo = array('Budget','Year'); 

    var $hasMany=array('Payment','Revenue', 
'AdjustmentFrom'=>array('className'=>'Adjustment','foreignKey'=>'s_project_id'), 
'AdjustmentTo'=>array('className'=>'Adjustment','foreignKey'=>'t_project_id'), 
'TransferFrom'=>array('className'=>'Transfer','foreignKey'=>'s_project_id'), 
'TransferTo'=>array('className'=>'Transfer','foreignKey'=>'t_project_id') 
); 

Я успешно создали контроллер с лесами, который добавляет/удаляет/обновляет настройки, но когда я испепелю код, я получаю сообщение «Ошибка: вызов функции-функции члена() для не-объекта», когда я пытаюсь добавить настройку.

Ошибка на следующей строке:

$sourceBudgets = $this->Adjustment->SourceBudget->find('list'); 
$targetBudgets = $this->Adjustment->TargetBudget->find('list'); 
$sourceProjects = $this->Adjustment->SourceProject->find('list'); 
$targetProjects = $this->Adjustment->TargetProject->find('list'); 
$this->set(compact('sBudgets', 'tBudgets', 'sProjects', 'tProjects')); 

Off ПРОДВИЖЕНИЯ нет модели SBudget, TBudget, SProject, TProject поэтому я редактировал код, как показано ниже:

$sourceBudgets = $this->Adjustment->Budget->find('list'); 
    $targetBudgets = $this->Adjustment->Budget->find('list'); 
    $sourceProjects = $this->Adjustment->Project->find('list'); 
    $targetProjects = $this->Adjustment->Project->find('list'); 
    $this->set(compact('sBudgets', 'tBudgets', 'sProjects', 'tProjects')); 

и я добавил строка public $ uses = array ('Budget', 'Project');

в классе контроллера регулировки. К сожалению, проблема сохраняется, и я всегда получаю сообщение об ошибке «Ошибка: вызов функции-члена функции find() для не-объекта».

+0

В какой-то строке вы получаете ошибку, потому что вы показываете 5 строк. Кроме того, вы определяете свою принадлежность к «Source_Budget», но ссылаетесь на нее как «SourceBudget».И наконец; это, по крайней мере, относится к * существующим * переменным; '$ this-> set (compact ('sourceBudgets', 'targetBudgets', 'sourceProjects', 'targetProjects')); – thaJeztah

+0

спасибо за ваш комментарий. Я получаю сообщение об ошибке «$ sourceBudgets = $ this-> Adjustment-> SourceBudget-> find ('list'); SourceBudget был произведен с помощью bake, такой же, как $ this-> set (compact ('sourceBudgets', 'targetBudgets', 'sourceProjects', 'targetProjects')) – leonidou

ответ

0

Псевдонимы, которые вы использовали в ассоциации принадлежность к первому блоку кода, неверны. Вместо Source_Budget это должно быть SourceBudget. Аналогично для других псевдонимов снижается подчеркивание.

+0

Спасибо за ваш ответ. Я удалил подчеркивание из ассоциаций, и у меня больше нет ошибки. Но $ sourceBudgets = $ this-> Adjustment-> SourceBudget-> find ('list'); не производят никаких данных. поэтому списки в моем представлении добавления пустые. изменение моего кода на $ sourceBudgets = $ this-> Budget-> find ('list'); все еще производит пустые списки при добавлении вида – leonidou

+0

Хорошо ли таблицы содержат записи? Проверьте журнал запросов и убедитесь, что созданные запросы выполнены так, как ожидалось. Выполните те же запросы непосредственно в mysql и проверьте. – ADmad

0

Я нашел его !!!

Проблема заключается в том, что переменные, сгенерированные в контроллере и переданные в представления с установленным, не используются по представлению правильно. Поясню:

выпекать производится переменная

$ sourceBudgets = $ this-> Adjustment-> Budget-> найти ('список'); и передал его в окно добавления. Однако в представлении добавления использовалась переменная с именем s_budget_id. так же как поле внешнего ключа, как указано в модели.

0

Постарайтесь сохранить имена в вашей модели согласованными, например. вместо:

'SourceBudget'=>array('className'=>'Budget','foreignKey'=>'s_budget_id'),

написать либо:

'SBudget'=>array('className'=>'Budget','foreignKey'=>'s_budget_id'),

или (вам нужно будет обновить базу данных):

'SourceBudget'=>array('className'=>'Budget','foreignKey'=>'source_budget_id'),

Ленивый можно просто поставить, соответственно:

'SBudget'=>array('className'=>'Budget'),

или:

'SourceBudget'=>array('className'=>'Budget'),

Ну, мне потребовались часы, чтобы понять это. Ребята CakePHP «являются большими поклонниками соглашения над конфигурацией» ;-)