2012-04-28 8 views
1

Я не вижу в этом документально нигде, поэтому я прошу вас, мои дорогие ежики.Безопасно ли выполнять запрос с помощью модели во время обратного вызова BeforeSave поведения?

ВнутриBehavior::BeforeSave(&$Model) метод а CakePHP, я читать и писать изменения в $Model->data массива. Прежде чем я закончу, мне нужно прочитать некоторые другие записи из базы данных. Я волнуюсь, что, если я использую $Model->find(), он перезапишет текущие данные в модели, которая вот-вот будет сохранена.

Просмотр исходного кода, функция Model::find() явно сбрасывает переменную Model::$id. Это та же самая переменная, которую я позже использую, чтобы проверить, обновляется ли поле.

Вот пример:

<?php 
    class UniqueBehavior extends ModelBehavior { 

     function beforeSave(&$Model){ 

      $value = $Model->data[$Model->alias]['unique_field']; 
      $query = array('conditions' => array('unique_field' => $value)); 
      if ($Model->find('first', $query){ 
       // Does $Model::find() reset the internal $Model->data array? 
       $Model->data[$Model->alias]['unique_field'] = "..." 
       //... some other code here 
      } 

      //ALSO... 
      if ($Model->exists()) // Returns true if a record with the currently set ID exists. 
      $slug = $Model->field('slug'); 

      // this should fetch the slug of the currently updated Model::id from the database 
      // if I do find()'s, can I trust that the record I'm getting is the right one? 
     } 
    } 
?> 

ответ

1

вы всегда можете сохранить текущий идентификатор в $ TMP и присвоить этот сохраненный идентификатор обратно в модель после того, как вы закончили

$tmp = $Model->id; 
// ... 
$Model->id = $tmp; 

Таким образом, вы не» t сталкиваются с проблемами с использованием идентификатора модели.

Если это экономит или нет, зависит от того, как вы работаете в своей модели. Я - например, никогда не полагаюсь на этот идентификатор. Я всегда назначаю идентификатор модели вручную до любого обновления или удаления вызова и т. Д. Но это необязательно, конечно. Тем не менее, вы должны быть более осторожными.

+0

Какая битва $ Model-> свойство данных? Должен ли я также сохранить его во временном массиве? –

+1

, если он также изменен, что, вероятно, будет разумным – mark

+0

Делает смысл. Документы для торта немного скудны по областям, ссылкам, запросам и обратным вызовам. Мне пришлось прорыть много кода ядра, чтобы понять их структуру MVC. –