我需要确保电子邮件字段对于当前联系人表是唯一的,并且我希望确保同一封电子邮件对于users表也是唯一的。如果在任一表中都找不到,则允许保存数据。
我不确定我是否以最佳方式检索数据。这是我找到工作的唯一方法。
此外,我可以让自定义检查工作,如果电子邮件存在则返回false,如果电子邮件不存在则返回true,但它仍然保存数据。如果发现电子邮件,不知道如何告诉它不要保存数据。
这是我目前的联系人表格模型:
<?php
namespace App\Model\Table;
use App\Model\Entity\Contact;
use Cake\ORM\Query;
use Cake\ORM\RulesChecker;
use Cake\ORM\Table;
use Cake\ORM\TableRegistry;
use Cake\Validation\Validator;
/**
* Contacts Model
*/
class ContactsTable extends Table
{
/**
* Initialize method
*
* @param array $config The configuration for the Table.
* @return void
*/
public function initialize(array $config)
{
$this->table('contacts');
$this->displayField('first_name');
$this->primaryKey('id');
$this->addBehavior('Timestamp');
}
/**
* Default validation rules.
*
* @param \Cake\Validation\Validator $validator Validator instance.
* @return \Cake\Validation\Validator
*/
public function validationDefault(Validator $validator)
{
$validator
->allowEmpty('id', 'create');
$validator
->add('email', [
'validateEmail' => [
'rule' => 'validateEmail',
'provider' => 'table',
'message' => 'That email already exists'
]
])
->requirePresence('email', 'create')
->notEmpty('email');
return $validator;
}
//check that the email is unique in both the Contacts table and in the Users table
public function validateEmail($value, $context) {
$usersTable = TableRegistry::get('Users');
$contactsTable = TableRegistry::get('Contacts');
if ( $contactsTable->exists(['email' => $value]) || $usersTable->exists(['email' => $value]) ) {
return false;
} else {
return true;
}
}
}
答案 0 :(得分:0)
当我第一次开始这项工作时,我无法弄清楚如何在表格中提取数据,但我使用我的OP中的方法让它工作。
但是,我不认为这是最好的方法。如果有人有更好的方法,请告诉我。
以上代码正在检查2个表中是否有唯一的电子邮件。
我也想出了如何显示消息。当我保存数据时,我使用以下代码覆盖了$ contact对象:
if ($contact = $this->Contacts->save($contact)) {
//code to execute
}
我将其改为:
$new_contact = $this->Contacts->save($contact)
它开始起作用了。