質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.63%

アソシエーションの保存について

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 471

samohan1987

score 16

 前提・実現したいこと

お世話になります。
cakephp3でアソシエーションの保存について勉強しているのですが、
以下の場合どのようにして保存すればいいかが分からなくなってしまったため
質問をさせていただきます。

★解決したい問題
1つの報告書に対し、複数の報告者が存在可能。その報告者には、1つのファイルを持たせることができる。
画面としては、
報告書を作成する画面で、報告者が報告内容を書き込めるようになっています。
その報告内容には1つのファイルを添付することができます。

アソシエーションの保存で、
報告書テーブルと、報告者テーブルは保存できたのですが、
ファイルテーブルに保存をすることができませんでした。
どうすれば保存ができるでしょうか。
ご教授願います。

■テーブル情報
・reports 報告書テーブル
id
title  タイトル

・reporters 報告者テーブル
id
report_id  報告書テーブルの外部キー
file_id    ファイルテーブルの外部キー
body    報告内容

・files ファイルテーブル 
id
file   ファイル

 該当のソースコード

   モデル(table)情報
    //報告書テーブルのモデル (table)
    public function initialize(array $config)
    {
        parent::initialize($config);

        $this->setTable('reports');
        $this->setDisplayField('title');
        $this->setPrimaryKey('id');

        $this->addBehavior('Timestamp');
        $this->hasMany('Reporters',[
           'foreignKey'=>'report_id' 
        ]);
    }
-------------------------------------------------------
    //報告者テーブルのモデル (table)
    public function initialize(array $config)
    {
        parent::initialize($config);

        $this->setTable('reporters');
        $this->setDisplayField('id');
        $this->setPrimaryKey('id');

        $this->belongsTo('Reports', [
            'foreignKey' => '_id',
            'joinType' => 'INNER'
        ]);
        $this->belongsTo('Files', [
            'foreignKey' => 'file_id',
            'joinType' => 'INNER'
        ]);
    }
------------------------------------------------------
//報告者テーブルのモデル (table)
    public function initialize(array $config)
    {
        parent::initialize($config);

        $this->setTable('files');
        $this->setDisplayField('id');
        $this->setPrimaryKey('id');

        $this->hasMany('Reporters', [
            'foreignKey' => 'file_id'
        ]);
    }
//ReportsController 

/*報告書登録*/
public function add(){
    $report = $this->Reports->newEntity();
    $report = $this->Reports->patchEntity($article, $this->request->getData(),[
        'associated' => ['Reporters.Files']
    ]);
    $this->Reports->save($report)
    //以下省略
}
  //報告書作成画面
    <?= $this->Form->create($report) ?>
    <fieldset>        
        <?php
            echo $this->Form->control('title');//タイトル
            echo $this->Form->control('reporter.0.body');//報告内容
            echo $this->Form->control('file.0.file');//ファイル
        ?>
    </fieldset>
    <?= $this->Form->button(__('Submit')) ?>
    <?= $this->Form->end() ?>

 補足情報(FW/ツールのバージョンなど)

cakephp3.6

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.63%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る