2012-06-26 5 views
0

Как добавить, если оно уже объявлено?CakePHP append to Containable/Contain

  1. Я называю регулярно содержать/находку:

    // A controller 
    $this->Site->contain(array('User')); 
    $site = $this->Site->find(); 
    
  2. Я хочу, чтобы автоматически добавить что-то содержать. Я думал сделать это в модели, добавив к функции поиска ... что-то вроде этого:

    // Site.php Model 
    function find($conditions = null, $fields = array(), $order = null, $recursive = null) { 
        if(!isset($this->containVariable) || !in_array('Box', $this->containVariable)) { 
         $this->containVariable[] = 'Box'; 
        } 
        parent::find($conditions, $fields, $order, $recursive); 
    } 
    

Чтобы сделать эту работу (автоматическое добавление моделируют Box содержать) Мне нужно только измените значение $this->containVariable на функцию или переменную, у которой есть массив того, что уже содержится. В этом случае это вернет array('User'). Как добавить, чтобы содержать, когда он уже объявлен? Есть ли содержащаяся переменная?

ответ

0

Если только кто-то может найти другое решение, я пришел к выводу, что:

К сожалению, то, что я пытался сделать, кажется невозможным, как Containable предназначен. Мне пришлось вручную добавить мою модель к каждому звонку ->contain().

0

Я исправил, возможно, аналогичную проблему с сохраняющейся записью для нескольких вызовов на поиск (используя cakephp 1.3). После объявления содержат для определенной модели, это будет установлен для этой модели:

$this->Behaviors->Containable->runtime 

-где $ это некоторая модель объекта. «runtime» - это массив, который по существу содержит содержащую информацию. Таким образом, вы близки я верю, но вместо того, чтобы:

$this->containVariable[] = 'Box' 

Вы бы:

$this->Behaviors->Containable->runtime['someModel']['contain'][] = 'Box' 

Чтобы иметь возможность указать больше, чем просто модель, хотя, вы должны настроить для обработки, как следующее (возможно построить метод соответственно):

$this->Behaviors->Containable->runtime['someModel']['contain'][] = $model_contain_array 

$ model_contain_array просто произвольное имя, я просто выбрал для массива, который держит содержат информацию, которую вы хотели бы добавить к particu lar. Примером $ model_contain_array может быть:

array('modelName' => array(
    'fields' => array('id', 'other'), 
    'otherModelName' => array(
     'fields' => array('id', 'otherfield', 'etc') 
    ) 
)