Cakephp 3.0 - 根据另一个模型中的数据验证输入

时间:2015-08-29 13:54:23

标签: cakephp-3.0

我是Cakephp 3.0的新手,我完全坚持数据验证,或者更确切地说是应用程序规则。

我有一个简单的用户注册表单,可以在表格中创建新用户'用户'。在用户注册表单中,有一个" ticket_number"的字段。用户必须输入必须存在于表ticket.ticket_number中的票号,并​​且tickets.registration_status必须为false(该票证尚未向用户注册)。 我的表看起来像这样(简化:)

用户:

id | username | password

票:

id | ticket_number | user_id | registration_status

在我的用户模型中,我已定义(用户可以拥有多张票证):

    $this->hasMany('Tickets', [
        'foreignKey' => 'user_id'
    ]);

在我的Tickets模型中,我已定义(故障单属于用户):

    $this->belongsTo('Users', [
        'foreignKey' => 'user_id',
        'joinType' => 'INNER'
    ]);

在用户模型中,我添加了一条规则来尝试检查ticket.ticket_number列中是否存在输入的ticket_number:

    public function buildRules(RulesChecker $rules)
{
    $rules->add($rules->isUnique(['username']));
    $rules->add($rules->isUnique(['email']));
    $rules->add($rules->existsIn
               (['ticket_number'], 'Tickets.ticket_number'));

    return $rules;
}

这给了我错误:

Error:  Call to a member function primaryKey() on a non-object 

我非常困在这里。任何人都可以建议实施此检查的正确方法吗?然后,如何实施检查以查看相关的registration_status是否为0(该票证尚未注册)。

提前感谢任何建议! --D。

2 个答案:

答案 0 :(得分:0)

existsIn规则无法解决您的问题,因为它不会考虑您的附加条件(registration-status)。

您需要提供自定义规则才能解决您所描述的问题。

关于您的更新:规则将返回true - 因此传递规则,如果您的表格设置不正确或无法找到您正在引用的字段或您的字段可以为空,请在此处查看来源:http://api.cakephp.org/3.0/source-class-Cake.ORM.Rule.ExistsIn.html#74-91

答案 1 :(得分:0)

好的,经过相当多的修补,我解决了第一个问题(在用户添加表单上,用户必须输入必须存在于表ticket.ticket_number中的票号。)

我可以使用UsersTable模型中的existsIn规则让这个工作的唯一方法是将ticket_number字段声明为TicketsTable模型的initialize方法中的主键:

$this->primaryKey('ticket_number');

然后在UsersTable模型中的associations和existsIn规则工作。但是,这并不好,因为我不希望故障单中的主键永久设置为ticket_number。它也没有解决我的第二个问题(检查tickets.registration_status是错误的。)

所以我采用了不同的方法,而是在我的用户控制器的add方法中使用了$this->loadModel('Tickets');。然后,我可以轻松执行所需的检查:

//Look for this particular ticket
    $ticketCount = $this->Tickets->find()->where(['Tickets.ticket_number' => $ticket_number])->count();
    $this->set(compact('ticketCount'));
    $this->set('_serialize', ['ticketCount']);
//If the ticket isn't found, then return with the Flash error
    if (!$ticketCount > 0) {
        $this->Flash->error(__('Sorry, but a Ticket with this number could not be found. Please, try again.'));
                   return;
    } //otherwise move on...
然后,我会同样查询故障单的注册状态,如果已经注册,则闪回不同的错误。

检查通过后,它会继续正常的添加用户检查和保存。

虽然这个解决方案并不像我希望在带有自定义关联和规则的Users模型中那样优雅,但它可以正常工作。

我也不相信它不能用规则在模型中完成。但就目前而言,这种解决方案可行。

无论如何,感谢hmic的回应。 DBZ