2017-01-05 4 views
0

私はCakePHPで小さなプロジェクトを持っています。 articlesという名前のテーブルとカテゴリ、タグ、画像などの5つのFieldsテーブルがあります。関連付けは主にHasOneであり、関連するテーブルには複数の列があります。記事のテーブルにデータを保存するとき すべてが、たとえば、良いように見えますが、いくつかの団体に:記事 - >評価、私は評価テーブルのいくつかのフィールドを埋めていなかった場合は、nullとして保存されています:CakePHP empty関連のフィールドは破棄の代わりに保存されます

+----+------------+--------------+ 
| id | article_id | rating_value | 
+----+------------+--------------+ 
| 1 |   36 |   3 | 
| 2 |   56 |  5454.56 | 
| 3 |   57 |   4 | 
| 5 |   51 |   NULL | 
+----+------------+--------------+ 

をいくつかのバリデーションを追加すると、バリデーションが必要なので記事を保存できません。私が望むのは、rating_valueが空の場合、null(エンティティが拒否された)として作成されてはならず、記事を保存する必要があるということです。 記事を削除すると、すべての関連エンティティが削除されます。

私はModel.beforeMarshallで$ dataを変更しようとしましたが、クラスはテーブルの記事と評価の両方でプライベートです(私は関連が問題であるかもしれないと思います)。

いくつかのコード(コントローラの追加):

public function add() 
    { 
    $article = $this->Articles->newEntity(); 
    if ($this->request->is('post')) { 
       $article = $this->Articles->patchEntity($article, $this->request->data, [ 
        'associated' => [ 
         'Ratings', 
        ] 
       ]); 
       if ($this->Articles->save($article)) { 
        $this->Flash->success(__('Saved.')); 
        return $this->redirect(['action' => 'index']); 
       } 
    } 
    $this->set('article', $article); 
} 

私はこのために、すべての関連するモデルのすべての検証を削除しました。

// Articles Table 
$this->hasOne('Ratings', [ 
    'className' => 'Ratings', 
    'dependent' => true, 
]); 

// Ratings Table 
$this->belongsTo('Articles', [ 
    'foreignKey' => 'article_id', 
    'joinType' => 'INNER' 
]); 
// Rating.php Entity 
protected $_accessible = [ 
    '*' => true, 
    'id' => false 
]; 
// Article.php Entity 
protected $_accessible = [ 
    '*' => true, 
]; 
+0

「** _私はModel.beforeMarshallに$データを変更しようとした_ **」...それは(の方法のうちの少なくとも1つ)を移動するための方法であるとして、あなたは、試したかを示します。また、「** _クラスはプライベート_ **です」ということについて詳しく説明していますが、そのステートメントは本当にわかりません。 – ndm

+0

私はデータを変更することはできませんし、Ratings.beforeMarshallと同じ 'object(ArrayObject)'オブジェクトを(ArrayObject)[272] プライベート 'storage' => )[231] private 'storage' => ... ' –

+0

[**配列オブジェクト**](http://php.net/arrayobject)をダンプするのはその内部がプライベートだが、制限なしでアクセスできます。他の配列を編集するのと同じように '$ data'を編集するだけです。 ** https://book.cakephp.org/3.0/en/orm/saving-data.html#modifying-request-data-before-building-entities** – ndm

答えて

0

私のことはすべてうまく見えます。テーブルのフィールドがデフォルト値をnullにしている可能性があります。たとえば、次のように

If 'rating_value' field in your table has default value null, 
make that default full to none first. 

検証はあなたではなく、まだあなたが見るために動作しませんので、ヌルvalue.Ifを節約するよりも何も保存与えないことを失敗した場合:

debug($this->request->data); 

とデータならばそこに見えますあなたのビュー(フォーム)から正しく来ています。 別の重要なことは、関連付けに異なる検証セットを使用できることです。 (see here

+0

デフォルト値がNULLでない場合: 'エラー:SQLSTATE [23000]:整合性制約違反:1048' rating_value 'カラムをnullにできません。 –

+0

mysqlにデータを挿入するためのトリガを定義しましたか?さもなければあなたのrating_valueはまだnullになります。あなたはdebug($ this-> request-.data)を見る必要があります。 –

0

rating_valueを設定している場合、すべての検証ルールを保存して検証しようとします。

You can remove the associated data if rating_value is empty like this

$dataToSave = $this->request->data; 
if(empty($dataToSave['rating']['rating_value'])){ 
    unset($dataToSave['rating']); 
} 
$article = $this->Articles->patchEntity($article, $dataToSave, [ 
    'associated' => [ 
     'Ratings', 
    ] 
]); 
+0

これはうまくいくようですが、コントローラーがこれを行うのに最適な場所ですか?私はforeachアイテムが空であるかどうかを確認するためにforeachアイテムを追加し、両方のaddit/edit acitonsでitem comprobationを追加することを意味します。 –

関連する問題