私は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,
];
「** _私はModel.beforeMarshallに$データを変更しようとした_ **」...それは(の方法のうちの少なくとも1つ)を移動するための方法であるとして、あなたは、試したかを示します。また、「** _クラスはプライベート_ **です」ということについて詳しく説明していますが、そのステートメントは本当にわかりません。 – ndm
私はデータを変更することはできませんし、Ratings.beforeMarshallと同じ 'object(ArrayObject)'オブジェクトを(ArrayObject)[272] プライベート 'storage' => )[231] private 'storage' => ... ' –
[**配列オブジェクト**](http://php.net/arrayobject)をダンプするのはその内部がプライベートだが、制限なしでアクセスできます。他の配列を編集するのと同じように '$ data'を編集するだけです。 ** https://book.cakephp.org/3.0/en/orm/saving-data.html#modifying-request-data-before-building-entities** – ndm