2013-04-12 6 views
0

Я пытаюсь построить код примера в http://book.cakephp.org/2.0/en/models/saving-your-data.html в разделе, которое начинается с «Сохранение связанных данных модели (hasOne, hasMany, принадлежит Too)». Тем не менее, я получаю следующее сообщение об ошибке, когда я называю снят с охраной:Сохранение связанных моделей с CakePHP

Косвенной модификации перегруженной AppModel недвижимости :: $ MealContent не имеют никакого эффекта [APP \ Controller \ MealsController.php, строка 15] Попытки изменить свойство non-object [APP \ Controller \ MealsController.php, строка 15]

Естественно, данные не сохраняются.

Как вы можете видеть, моя заявка не имеет компаний или счетов. Вместо этого у меня есть Meals и MealContents, но отношения, похоже, были настроены одинаково. Очевидно, есть проблема где-то, хотя вот какой-то код.

Meals.php:

class Meals extends Entry { 

    public $hasMany = 'MealContents'; 
    public $validate = array(
     'Timestamp' => array(
      'validDate' => array(
       'rule' => array('garbageDateChecker'), 
       'required' => true, 
       'message' => 'The date could not be understood.'), 
      'noTimeTravel' => array(
       'rule' => array('noTimeTravel'), 
       'required' => true, 
       'message' => 'You cannot enter times in the future.') 
     ) 
    ); 

} 

MealContents.php:

class MealContents extends Entry { 

    public $belongsTo = 'Meals'; 
    public $validate = array(
     'Meals_ID' => array(
      'notEmpty' => array(
       'rule' => 'notEmpty', 
       'required' => true, 
       'message' => 'This field cannot be blank') 
     ), 
     'Item_ID' => array(
      'notEmpty' => array(
       'rule' => 'notEmpty', 
       'required' => true, 
       'message' => 'This field cannot be blank') 
     ) 
    ); 

} 

И, наконец, индекс контроллера функции():

public function index() { 
     $this->set('title_for_layout', "Food Log"); 
     if ($this->request->is('post')) { 
      $this->Meal->create(); 

      unset($this->Meal->MealContent->validate['Meals_ID']); 
      if ($this->Meal->saveAssociated($this->request->data)) { 
       $this->Session->setFlash('The meal was logged.'); 
       $this->redirect(array('action' => 'index')); 
      } else { 
       $this->Session->setFlash("Couldn't save the meal."); 
      } 
     } 
    } 

Entry.php

abstract class Entry extends AppModel { 

    public function garbageDateChecker($dateToCheck) { 
     date_default_timezone_set("America/Tijuana"); 
     $result = TRUE; 

     try { 
      new DateTime($dateToCheck['Timestamp']); 
     } catch (Exception $e) { 
      $result = FALSE; 
     } 

     return $result; 
    } 

    public function noTimeTravel($dateToCheck) { 
     date_default_timezone_set("America/Tijuana"); 
     $result = TRUE; 

     $objectifiedDateToCheck = new DateTime($dateToCheck['Timestamp']); 
     $currentTime = new DateTime("now"); 

     if ($objectifiedDateToCheck > $currentTime) { 
      $result = FALSE; 
     } 

     return $result; 
    } 

} 

Я уверен, что сбой save() не связан с проверкой, потому что даже когда я прокомментирую правило проверки и строку unset(), данные не сохраняются.

Было бы легко обвинить его в плохих данных или привинченном виде. Однако данные выглядят ОК:

$this->request->data 
--MealContents 
---[0] 
-----[Food_Item_ID] = "0" 
--Meals 
---[Comments] = "" 
---[Timestamp] 
-----[day] = "12" 
-----[hour] = ... 

Что я пропустил, когда прочитал книгу CakePHP?

ответ

1

Во всех объявлениях класса модели вы должны расширить класс AppModel, а не «Ввод». Кроме того, вам нужно изменить имена своих моделей на сингулярные существительные. Питание вместо еды.

class Meal extends AppModel { 

    //your model's code 

} 

class MealContent extends AppModel { 

    //your model's code 

} 

В контроллере, если вы хотите, чтобы пропустить проверку на вызов saveAssociated, вы можете передать массив опций, с элементом «проверки» установлен в значение False в качестве второго параметра. Вы никогда не должны использовать unset на вашей модели, как это, поскольку это повлияет на остальную часть вашего приложения.

$this->Meal->saveAssociated($this->request->data, array("validate" => false)); 
+0

На самом деле, я расширяю AppModel. Я включил класс Entry в сообщение, чтобы продемонстрировать. Я оставлю дополнительные комментарии относительно ваших других предложений. –

+0

Я бы предпочел не отключать все проверки. –

+0

Несмотря на то, что таблица блюд правильно получает строку, таблица Meal_Contents остается пустой. –

Смежные вопросы