私はいくつかの値を手動で設定し、他の値はpatchEntityを使用して設定するエンティティ(予約)を持っています。 しかし、保存になると、2つの必須フィールドがないことを示すエラーが表示されます。CAKEPHP 3.x - エンティティ更新のエラー - 値がある場合でも主張されていないフィールド
これは、エンティティのデバッグは、次のようになります。「日付」、あなたが見ることができるように
object(App\Model\Entity\Booking) {
'provider_pk' => (int) 2,
'date' => object(Cake\I18n\Time) {
'time' => '2016-03-31T00:00:00+00:00',
'timezone' => 'UTC',
'fixedNowTime' => false
},
'start' => object(Cake\I18n\Time) {
'time' => '2016-03-31T08:00:00+00:00',
'timezone' => 'UTC',
'fixedNowTime' => false
},
'modules_count' => (int) 1,
'requester_pk' => (int) 1,
'remarks' => '',
'status_id' => (int) 1,
'end' => object(Cake\I18n\Time) {
'time' => '2016-03-31T09:00:00+00:00',
'timezone' => 'UTC',
'fixedNowTime' => false
},
'[new]' => true,
'[accessible]' => [
'*' => true
],
'[dirty]' => [
'provider_pk' => true,
'date' => true,
'start' => true,
'modules_count' => true,
'requester_pk' => true,
'remarks' => true,
'status_id' => true,
'end' => true
],
'[original]' => [],
'[virtual]' => [],
'[errors]' => [
'date' => [
'_required' => 'This field is required'
],
'start' => [
'_required' => 'This field is required'
]
],
'[invalid]' => [],
'[repository]' => 'Bookings'
}
、および「スタート」フィールドに値を持っていますが、エラーのセクションでは、それは彼らがしていることを示してい行方不明
この私が新しいエンティティ($日と$開始し、対応する値を持つ)を作成する方法である:
$booking = $this->Bookings->newEntity([ 'provider_pk' => $provider_pk, 'date' => $date, 'start' => $start ]);
その後、私はpatchEntityを使用して、それを保存する前に、私は手動で別のフィールドを設定し、してみてくださいこのようにそれを保存するために:)
$booking = $this->Bookings->patchEntity($booking, $this->request->data);
$booking->end = $end->modify('+' . $booking->modules_count . ' hours');
if ($this->Bookings->save($booking))
{
$this->Flash->success(__('The booking has been saved.'));
return $this->redirect(['action' => 'show' ]);
} else ...
そして$ booking->エラーは、(これを与える:
[
'date' => [
'_required' => 'This field is required'
],
'start' => [
'_required' => 'This field is required'
]
]
あなたが見ることができるように、元の値があったとしても、日付フィールドと開始フィールドは必須であると主張されています。
私は間違っていますか?ここで
はテーブルモデルです:
<?php
namespace App\Model\Table;
use App\Model\Entity\Booking;
use Cake\ORM\Query;
use Cake\ORM\RulesChecker;
use Cake\ORM\Table;
use Cake\Validation\Validator;
/**
* Bookings Model
*
* @property \Cake\ORM\Association\BelongsTo $Statuses
*/
class BookingsTable extends Table
{
/**
* Initialize method
*
* @param array $config The configuration for the Table.
* @return void
*/
public function initialize(array $config)
{
parent::initialize($config);
$this->table('bookings');
$this->displayField('id');
$this->primaryKey('id');
$this->belongsTo('Statuses', [
'foreignKey' => 'status_id',
'joinType' => 'INNER'
]);
// ---------------------------------------------------------------------
// customize for every project
$this->hasMany('Aircrafts');
$this->belongsTo('Pilots', [ 'foreignKey' => 'requester_pk', 'joinType' => 'LEFT' ]);
}
/**
* Default validation rules.
*
* @param \Cake\Validation\Validator $validator Validator instance.
* @return \Cake\Validation\Validator
*/
public function validationDefault(Validator $validator)
{
$validator
->integer('id')
->allowEmpty('id', 'create');
$validator
->date('date')
->requirePresence('date', 'create')
->notEmpty('date');
$validator
->dateTime('start')
->requirePresence('start', 'create')
->notEmpty('start');
$validator
->dateTime('end')
->requirePresence('end', 'create')
->notEmpty('end');
$validator
->integer('modules_count')
->requirePresence('modules_count', 'create')
->notEmpty('modules_count');
$validator
->integer('requester_pk')
->requirePresence('requester_pk', 'create')
->notEmpty('requester_pk');
$validator
->integer('provider_pk')
->allowEmpty('provider_pk');
$validator
->integer('assistant_pk')
->allowEmpty('assistant_pk');
$validator
->allowEmpty('remarks');
return $validator;
}
/**
* Returns a rules checker object that will be used for validating
* application integrity.
*
* @param \Cake\ORM\RulesChecker $rules The rules object to be modified.
* @return \Cake\ORM\RulesChecker
*/
public function buildRules(RulesChecker $rules)
{
$rules->add($rules->existsIn(['status_id'], 'Statuses'));
return $rules;
}
}
そしてここでは、コントローラのメソッドです:
/** form for booking confirmation
*
* @param string|null $id cell id.
* @return \Cake\Network\Response|null Redirects to bookings/show .
**/
public function confirmBooking()
{
if(isset($this->request->query['id']))
{
$id = $this->request->query['id'];
$token = strpos($id, '-');
$day = substr($id, $token + 1 , 2);
$month = substr($id, $token + 3 , 2);
$year = substr($id, $token + 5 , 4);
$hour = substr($id, $token + 9 , 2);
$minutes = substr($id, $token + 11, 2);
$date = Time::createFromTimestamp(mktime(0, 0, 0, $month, $day, $year));
$start = Time::createFromTimestamp(mktime($hour, $minutes, 0, $month, $day, $year));
$end = Time::createFromTimestamp(mktime($hour + 1, $minutes, 0, $month, $day, $year));
$provider_pk = substr($id, 1, $token - 1);
}
$aircrafts = $this->Bookings->Aircrafts->find('all', [ 'order' => 'registration' ]);
$this->set('aircrafts', $aircrafts);
// ---------------------------------------------------------------------
// depending on add or update
if(isset($this->request->query['booking_id']))
$booking = $this->Bookings->get($this->request->query['booking_id'], [ 'contain' => [ 'Pilots' ] ]);
else
{
$booking = $this->Bookings->newEntity([ 'provider_pk' => $provider_pk, 'date' => $date, 'start' => $start, 'end' => $end, 'modules_count' => 1 ]);
}
if ($this->request->is('post') || ($this->request->is('put') && isset($this->request->query['booking_id']))) {
debug($this->request->data);
$booking = $this->Bookings->patchEntity($booking, $this->request->data);
$booking->end = $end->hour($this->request->data[ 'end_value' ][ 'hour' ]);
$booking->modules_count = $booking->end->diff($booking->start)->format('%h');
if ($this->Bookings->save($booking))
{
$this->Flash->success(__('The booking has been saved.'));
return $this->redirect(['action' => 'show' ]);
} else
{
$this->Flash->error(__('The booking could not be saved. Please, try again.') );
return $this->redirect(['action' => 'show']);
}
}
$statuses = $this->Bookings->Statuses->find('list', ['limit' => 200]);
$assistants = $this->Bookings->Pilots->find('list' , [ 'conditions' => [ 'is_instructor =' => true ], 'fields' => [ 'id', 'firstname' ] ]);
$providers = $this->Bookings->Aircrafts->find('list' , [ 'fields' => [ 'id', 'registration' ] ]);
$requesters = $this->Bookings->Pilots->find('list' , [ 'fields' => [ 'id', 'lastname' ] ]);
$this->set(compact('booking', 'statuses'));
$this->set('_serialize', ['booking']);
$this->set('assistants', $assistants);
$this->set('providers', $providers);
$this->set('requesters', $requesters);
}
テーブルコードだけでなく、これを実行しているコントローラアクションをすべて表示できますか?あなたは私たちにパズルの小さな部分を与えているだけです。 – chrisShick