2011-07-12 8 views
0

提出時のフォーム(newreports.php)は、テーブルに保存するだけでなく、隠しデータ(それぞれ7列の27レコード)をBelongsToテーブルに保存する必要があります。 id、user_id、reports_id、count、area、area_id、commentsの7つのカラムがあります。 Areaは0〜26の値で事前入力する必要があり、reports_idはall(100)で同じにする必要があります。 User_idは、フォームエントリから事前に入力する必要があります。また、IDは自動入力される必要があります。私はこれが私のコントローラのnewreports()関数で実行できると思います。cakePHPの複数のテーブルに保存する方法BelongsTo?

このような配列を記述する必要がありますか、または単純化された方法がありますか?

$this->Report->saveAll(
    Array 
(
    [Report] => Array 
     (
      [0] => Array 
       (
        [id] => //leave blank because it will auto-fill? 
      [user_id] => //dynamically from form input 
        [reports_id] => //dynamically from form input 
        [area_id] => //dynamically from form input 
        [area] => 0 
    [count] => // this should be blank as there are no counts yet 
    [comments] => // this should be blank as there are no comments yet 
       ) 
     [1] => Array 
       (
        [id] => //leave blank because it will auto-fill? 
      [user_id] => //dynamically from form input 
        [reports_id] => //dynamically from form input 
        [area_id] => //dynamically from form input 
        [area] => 1 
    [count] => // this should be blank as there are no counts yet 
    [comments] => // this should be blank as there are no comments yet 
       ) 
     ) 
) 

答えて

0

フォーム/ビューコードは、正しい方法で書かれている場合は、$this->Report->saveAll($this->data['Report']);で逃げることができるはずです。

フォームのHTMLソースを表示します。これがPOSTされます場合は名前の値がなどdata[Report][0][id]data[Report][0][user_id]、のようなものでなければなりませんinputタグの属性番目のレコードがdata[Report][1][id]のように見えるフィールド、data[Report][2][user_id]など

を持っている必要があり、それが自動的にインポートされます$ this-> dataに正しい配列構造体があります。

このフォームで常に新しいレコードが作成される場合は、data[Report][][id]フィールドを除外(または空白のままにしておく)し、saveAllは新しいレコードを作成します。


最初のコメントを処理するための更新。

コントローラが隠しデータをすべて保存した後、または保存する前に$ dataに代入したいかどうかは不明です。両方の部分を扱いましょう。最初に、保存します。

だから、your own answerは、ほぼデータを作成する権利がほとんど得られます。

$count = 27; 
$v = 0; 
$data = array('Report' => array()); 
do { 
    $data['Report'][] = array('reports_id' => $id, 'area' => $v); 
    $v++; 
} while ($v < $count); 

// save report rows to database 
$this->Report->saveAll($data['Report']); 

だから、それはあなたがあなたの元の質問で、そしてあなたの答えでやったくらいのようなデータ構造を準備します。ただし、すべてを一度に作成するにはsaveAll()を使用します。

次の部分は、保存されたデータを取得して$ this-> dataに入れて、あなたのコメントに応じてリダイレクト後にユーザーに表示される形式で使用できるようにすることです。コントローラには、このようなものが必要です。

$reports = $this->Report->find('all', array(
    'conditions' => array(
     'reports_id' => $id 
    ) 
)); 
// merge this in with existing data 
$this->data = Set::merge($reports, $this->data); 

リダイレクトの一部として$ idがURLにあるとします。そしてそれはあなたがそのデータを$ this-> dataに割り当てる方法です。あなたのフォームでそれを使うことができます。

そして、あなたの形で

、あなたがそうのような複数のフィールドを参照することができます。

$this->Form->create('Report'); 

foreach ($data['Report'] as $i => $report) { 
    $this->Form->input('Report.'.$i.'.id'); 
    $this->Form->input('Report.'.$i.'.user_id'); 
    $this->Form->input('Report.'.$i.'.reports_id'); 
    $this->Form->input('Report.'.$i.'.area_id'); 
    $this->Form->input('Report.'.$i.'.area'); 
    $this->Form->input('Report.'.$i.'.count'); 
    $this->Form->input('Report.'.$i.'.comment'); 
} 

$this->Form->end('Submit); 

あなたはread more about forms for multiple records at the CakePHP manualをすることができます。

+0

それをやったことを、この配列は、フォームの入力からではありませんまたそれのためのビューがあります。それは隠されています。私は人々がそれを見ることを望んでいません。私はそれをバックグラウンドで実行する必要があります、自動入力またはデータベーステーブルを事前に入力して、このデータを編集できるビューにユーザーをリダイレクトします。そこには、いくつかの動的に割り当てられた静的な値と、dbに保存または挿入する必要があるものが含まれています。現在、これは私のコントローラにあります。この配列は$ dataにどのように割り当てられますか? – sloga

1

これは私のために

$count = 27; 
$v = 0; 
    do { 
     ######### save report rows to database 
     $this->Report->create(); 
     $this->Report->set(array('reports_id' => $id , 'area' => $v)); 
       $this->Report->save(); 
     $v++; 
    } while ($v < $count); 
関連する問題