2013-03-27 3 views
-2

cake php에서 데이터를 저장하는 데 약간의 문제가 있습니다.cakephp 관련 모델의 관련 모델 (오타가 아님)에 대한 데이터 저장

여기 모델/관계가 있습니다.

  • 지구 hasMany의 부서
  • 부서 hasMany의 그룹

나는 사용자가 다수의 작성을 허가 한있는, 새로운 지구를 만들기위한보기입니다 새로운 부서. 각 부서를 생성하는 동안 사용자는 해당 부서의 여러 그룹을 작성할 수 있습니다. 이제 문제는 그룹 데이터를 저장하는 방법을 확신 할 수 없다는 것입니다.

즉석에서 작성되는 부서의 경우 입력 (예 : "Department.0.name", Department.0.type)에 대해 다중 색인 방법을 사용합니다. 이렇게하면 saveAll을 사용하여 저장할 수 있습니다. 방법. 그러나 생성 된 각 그룹에 대해 department_id가 필요하며 지구의 부서 중 어느 것도 아직 저장되지 않았으므로 ID가 없습니다. 이 새로운 지구의 데이터를 저장하고, 새로운 부서와 관련된 새로운 그룹을 저장하는 방법은 무엇입니까? "Department.0.Group.0.name"과 같은 적절한 연결을 생성 할 그룹 입력의 이름 속성을 처리 할 수있는 방법이 있습니까?

미리 감사드립니다. 불명확 한 점이 있으면 주저하지 말고 다시 말해주십시오.

답변

2

POST 데이터 배열은 어떤 모양입니까?

<?php 

debug($this->data); 

?> 

은 올바른 형식이 아닌 경우, 관련 모델이 저장되지 않습니다 .. 케이크는 아직 저장되지 않은 모델의 "lastInsertId()"를 잡아 알고, 그래서 당신 돈 그 점에 대해 걱정할 필요가 없습니다 ... 제가 확신 할 수 없으며, 문서가 실제로 들어 가지 않는 경우, 저장이 얼마나 깊은 지입니다.

$this->data = 
Array 
(
    [Article] => Array 
     (
      [title] => My first article 
     ) 
    [Comment] => Array 
     (
      [0] => Array 
       (
        [comment] => Comment 1 
        [user_id] => 1 
       ) 
      [1] => Array 
       (
        [comment] => Comment 2 
        [user_id] => 2 
       ) 
     ) 
) 

$this->Article->saveAll($this->data); 

이것은 'hasMany의'관계의 관련 모델을 저장하기위한 올바른 구조 (CakePHP는 1.3)이다,하지만 난 그것이 어떤 깊은 이상의 아이를가는 경우 확실하지 않다 다음과 같이 제공하는 예입니다.

위의 형식에 따라 배열을 작성하지만 상위 모델은 그대로 두는 것이 좋습니다. 그런 다음 부모 모델 데이터를 수동으로 저장하고 :: getLastInsertId(); 그런 다음 부서 및 그룹에 대해 saveAll을 수행하십시오.


[UPDATE] 난 그냥 당신의 이론을 시험하고 당신이하고자하는 방식으로 작동합니다.

<?php 

echo $this->Form->input('Department.0.Group.0.name'); 

?> 

가 생성됩니다

<input name="data[Department][0][Group][0][name]" type="text" id="Department0Group0name"> 

[업데이트 2] 내가했던 일부 lib 디렉토리/케이크/모델/Model.php 탐험과 발견이 :

<?php 
... 

public function saveAssociated($data = null, $options = array()) { 
    ... 
    ... // code omitted. 
    ... 
    if ($options['deep']) { // This will recurse infinitely through all associations 
     $saved = $this->{$association}->saveAssociated($values, array_merge($options, array('atomic' => false))); 
    } 
    ... 
    ... 
    ... // code omitted. 
... 
?> 
+0

감사합니다!마찬가지로 saveAll과 마찬가지로 이해할 수있는대로 모델 데이터와 관련 모델 데이터를 저장합니다. 그래서, 위의, 그것 모두를 구할 것입니다. saveAll은 여러 save 메소드에 대한 랩퍼이며, 그 중 하나는 saveAssociated()입니다. 깊이 관련 모델의 관련 모델에 대한 데이터를 저장하려면 saveAssociated ($ data, array ('deep'=> true))를 사용할 수 있다고 생각합니다. 지구 활동에 대한 견해 내에서 그룹에 대한 입력을 수동으로 작성하고 있습니다. name 속성을' Todd

+0

그건 맞아, '깊은'=> 사실 응? 나는 결코 그것을 사용하지 않았다, 좋은 생각. 나는 당신의 입력 이름이 유효하다고 믿고 그것이 올바른 구조를 만들 것이라고 믿습니다. ' Form-> input ('Modelname.0.fieldname'); echo $ this-> Form-> input ('Modelname.1.fieldname'); ?> ' –

+1

엔티티 깊이 제한 '1.2에서는 중첩 된 키가 5 개로 엄격하게 제한되었습니다. 이로 인해 일부 컨텍스트에서 양식 입력 작성에 중대한 제한이있었습니다. 이제 1.3에서 무한대로 중첩 된 양식 요소 키를 작성할 수 있습니다. 유효성 검사 오류 및 임의의 깊이에 대한 값 읽기도 추가되었습니다. 제한이 무한대 인 것처럼 보입니다. :) –