2015-05-17 2 views
0

У меня есть стол comments с колонкой parent_id.Как построить правило существует или равно числу в cakephp 3?

И это содержание CommentsTable.php:

namespace App\Model\Table; 

use App\Model\Entity\Comment; 
use Cake\ORM\Query; 
use Cake\ORM\RulesChecker; 
use Cake\ORM\Table; 
use Cake\Validation\Validator; 

/** 
* Comments Model 
*/ 
class CommentsTable extends Table 
{ 

    /** 
    * Initialize method 
    * 
    * @param array $config The configuration for the Table. 
    * @return void 
    */ 
    public function initialize(array $config) 
    { 
     $this->table('comments'); 
     $this->displayField('id'); 
     $this->primaryKey('id'); 
     $this->belongsTo('Users', [ 
      'foreignKey' => 'user_id', 
      'joinType' => 'INNER' 
     ]); 
     $this->belongsTo('Posts', [ 
      'foreignKey' => 'post_id', 
      'joinType' => 'INNER' 
     ]); 
     $this->belongsTo('ParentComments', [ 
      'className' => 'Comments', 
      'foreignKey' => 'parent_id' 
     ]); 
     $this->hasMany('ChildComments', [ 
      'className' => 'Comments', 
      'foreignKey' => 'parent_id' 
     ]); 
    } 

    /** 
    * Default validation rules. 
    * 
    * @param \Cake\Validation\Validator $validator Validator instance. 
    * @return \Cake\Validation\Validator 
    */ 
    public function validationDefault(Validator $validator) 
    { 
     $validator 
      ->add('id', 'valid', ['rule' => 'numeric']) 
      ->allowEmpty('id', 'create') 
      ->requirePresence('body', 'create') 
      ->notEmpty('body') 
      ->requirePresence('path', 'create') 
      ->notEmpty('path') 
      ->add('status', 'valid', ['rule' => 'numeric']) 
      ->requirePresence('status', 'create') 
      ->notEmpty('status') 
      ->add('created_at', 'valid', ['rule' => 'datetime']) 
      ->requirePresence('created_at', 'create') 
      ->notEmpty('created_at') 
      ->add('updated_at', 'valid', ['rule' => 'datetime']) 
      ->requirePresence('updated_at', 'create') 
      ->notEmpty('updated_at'); 

     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(['user_id'], 'Users')); 
     $rules->add($rules->existsIn(['post_id'], 'Posts')); 
     $rules->add($rules->existsIn(['parent_id'], 'ParentComments')); 
     return $rules; 
    } 
} 

Я хочу построить правило для поля parent_id: существуют в ParentComments или равно 0.

Можете ли вы мне помочь?

спасибо.

ответ

2

Правила - это только вызываемые функции или вызываемые классы. Функция existsIn() - это просто псевдоним для класса ExistsIn. Мы можем использовать в своих интересах:

... 

use Cake\ORM\Rule\ExistsIn; 
class CommentsTable extends Table 
{ 
... 
    public function buildRules(RulesChecker $rules) 
    { 
     ... 
     $rules->add(
      function ($entity, $options) { 
       $rule = new ExistsIn(['parent_id'], 'ParentComments'); 
       return $entity->parent_id === 1 || $rule($entity, $options); 
      }, 
      ['errorField' => 'parent_id', 'message' => 'Wrong Parent'] 
     ); 
     return $rules; 
    } 
} 
Смежные вопросы