cakehp4:无法在hasone中保存关联



我编写了以下代码来将数据从MailFormsController存储到客户和消息模型

控制器/MailFormsController.php

<?php
declare(strict_types=1);
namespace AppController;
use CakeDatasourceConnectionManager;
use CakeCoreExceptionException;
use CakeORMTableRegistry;
/**
* MailForms Controller
*
* @method AppModelEntityMailForm[]|CakeDatasourceResultSetInterface paginate($object = null, array $settings = [])
*/
class MailFormsController extends AppController
{
/**
* Index method
*
* @return CakeHttpResponse|null|void Renders view
*/
public function index()
{
if($_SERVER['REQUEST_METHOD'] == 'POST'){
// $this->loadModel('Customers');
$this->Customers = TableRegistry::get('customers');
$this->Messages = TableRegistry::get('messages');
$post_data = $this->request->getData();
$customerData = $this->Customers->newEmptyEntity();
$customerData = $this->Customers->patchEntity($customerData, $this->request->getData(), ['associated' => ['Messages']]);
if ($this->Customers->save($customerData)) {
$this->Flash->success(__('The site name has been saved.'));
return $this->redirect(['action' => 'index']);
} else {
$this->Flash->error(__('The entry data could not be saved. Please, try again.'));
}
}
}
}

查看模板模板/MailForms/index.php

<?php
echo $this->Form->create();
echo $this->Form->control('name');
echo $this->Form->control('mail');
echo $this->Form->control('messages.0.message_1');
echo $this->Form->control('messages.0.message_2');
echo $this->Form->control('messages.0.message_3');
echo $this->Form->button('POST', ['type' => 'submit']);

模型/表/客户表.php

<?php
declare(strict_types=1);
namespace App/Model/Table;
use CakeORMQuery;
use CakeORMRulesChecker;
use CakeORMTable;
use CakeValidationValidator;

/**
* Customers Model
*
* @method AppModelEntityCustomer newEmptyEntity()
* @method AppModelEntityCustomer newEntity(array $data, array $options = [])
* @method AppModelEntityCustomer[] newEntities(array $data, array $options = [])
* @method AppModelEntityCustomer get($primaryKey, $options = [])
* @method AppModelEntityCustomer findOrCreate($search, ?callable $callback = null, $options = [])
* @method AppModelEntityCustomer patchEntity(CakeDatasourceEntityInterface $entity, array $data, array $options = [])
* @method AppModelEntityCustomer[] patchEntities(iterable $entities, array $data, array $options = [])
* @method AppModelEntityCustomer|false save(CakeDatasourceEntityInterface $entity, $options = [])
* @method AppModelEntityCustomer saveOrFail(CakeDatasourceEntityInterface $entity, $options = [])
* @method AppModelEntityCustomer[]|CakeDatasourceResultSetInterface|false saveMany(iterable $entities, $options = [])
* @method AppModelEntityCustomer[]|CakeDatasourceResultSetInterface saveManyOrFail(iterable $entities, $options = [])
* @method AppModelEntityCustomer[]|CakeDatasourceResultSetInterface|false deleteMany(iterable $entities, $options = [])
* @method AppModelEntityCustomer[]|CakeDatasourceResultSetInterface deleteManyOrFail(iterable $entities, $options = [])
*
* @mixin CakeORMBehaviorTimestampBehavior
*/
class CustomersTable extends Table
{
/**
* Initialize method
*
* @param array $config The configuration for the Table.
* @return void
*/
public function initialize(array $config): void
{
parent::initialize($config);

$this->setTable('customers');
$this->setDisplayField('name');
$this->setPrimaryKey('id');
$this->hasOne('Messages')->setForeignKey('customers_id');
$this->addBehavior('Timestamp');

}

/**
* Default validation rules.
*
* @param CakeValidationValidator $validator Validator instance.
* @return CakeValidationValidator
*/
public function validationDefault(Validator $validator): Validator
{
$validator
->scalar('name')
->maxLength('name', 255)
->requirePresence('name', 'create')
->notEmptyString('name');

$validator
->scalar('mail')
->maxLength('mail', 255)
->requirePresence('mail', 'create')
->notEmptyString('mail');

return $validator;
}
}

Model/Table/MessagesTable.php

<?php
declare(strict_types=1);
namespace AppModelTable;
use CakeORMQuery;
use CakeORMRulesChecker;
use CakeORMTable;
use CakeValidationValidator;
/**
* Messages Model
*
* @property AppModelTableCustomersTable&CakeORMAssociationBelongsTo $Customers
*
* @method AppModelEntityMessage newEmptyEntity()
* @method AppModelEntityMessage newEntity(array $data, array $options = [])
* @method AppModelEntityMessage[] newEntities(array $data, array $options = [])
* @method AppModelEntityMessage get($primaryKey, $options = [])
* @method AppModelEntityMessage findOrCreate($search, ?callable $callback = null, $options = [])
* @method AppModelEntityMessage patchEntity(CakeDatasourceEntityInterface $entity, array $data, array $options = [])
* @method AppModelEntityMessage[] patchEntities(iterable $entities, array $data, array $options = [])
* @method AppModelEntityMessage|false save(CakeDatasourceEntityInterface $entity, $options = [])
* @method AppModelEntityMessage saveOrFail(CakeDatasourceEntityInterface $entity, $options = [])
* @method AppModelEntityMessage[]|CakeDatasourceResultSetInterface|false saveMany(iterable $entities, $options = [])
* @method AppModelEntityMessage[]|CakeDatasourceResultSetInterface saveManyOrFail(iterable $entities, $options = [])
* @method AppModelEntityMessage[]|CakeDatasourceResultSetInterface|false deleteMany(iterable $entities, $options = [])
* @method AppModelEntityMessage[]|CakeDatasourceResultSetInterface deleteManyOrFail(iterable $entities, $options = [])
*
* @mixin CakeORMBehaviorTimestampBehavior
*/
class MessagesTable extends Table
{
/**
* Initialize method
*
* @param array $config The configuration for the Table.
* @return void
*/
public function initialize(array $config): void
{
parent::initialize($config);
$this->setTable('messages');
$this->setDisplayField('id');
$this->setPrimaryKey('id');
$this->addBehavior('Timestamp');
$this->belongsTo('Customers', [
'foreignKey' => 'customers_id',
'joinType' => 'INNER',
]);
}
/**
* Default validation rules.
*
* @param CakeValidationValidator $validator Validator instance.
* @return CakeValidationValidator
*/
public function validationDefault(Validator $validator): Validator
{
$validator
->integer('customers_id')
->requirePresence('customers_id', 'create')
->notEmptyString('customers_id');
$validator
->scalar('message_1')
->maxLength('message_1', 255)
->requirePresence('message_1', 'create')
->notEmptyString('message_1');
$validator
->scalar('message_2')
->maxLength('message_2', 255)
->requirePresence('message_2', 'create')
->notEmptyString('message_2');
$validator
->scalar('message_3')
->requirePresence('message_3', 'create')
->notEmptyString('message_3');
return $validator;
}
/**
* Returns a rules checker object that will be used for validating
* application integrity.
*
* @param CakeORMRulesChecker $rules The rules object to be modified.
* @return CakeORMRulesChecker
*/
public function buildRules(RulesChecker $rules): RulesChecker
{
$rules->add($rules->existsIn('customers_id', 'Customers'), ['errorField' => 'customers_id']);
return $rules;
}
}

我已经在CustomersTable.php中与hasone for Messages建立了关联,但当我运行此程序时,数据只存储在Customers表中,而不存储在Messages表中。

请告诉我这个程序有什么问题,以及如何保存关联?

因为它是hasOne关系,所以每个客户只有一条消息,您的字段应该相应地命名:

echo $this->Form->control('message.message_1');
echo $this->Form->control('message.message_2');
echo $this->Form->control('message.message_3');

最新更新