0

データベースに2つの名前を入力しようとするたびに、モデルが一貫してfalseを返すのはなぜですか。これが私のモデル全体です。私がしているのは、to / biller、partytwo/partyoneの両方がリレーションシップテーブルに存在することを確認することだけです。デバッグキットをチェックすると、フォームが正しい変数を取り込んでいることが示されますが、これをチェックすると-> validationErrors-何も返されませんか?助けてください。

class Invoice extends AppModel{ 
        var $name='Invoice'; 
        public $useTable = 'invoices';
        public $primaryKey = 'id';
        public $belongsTo = array(
        'Relationship' =>array(
            'className' => 'Relationship',
            'foreignKey' =>'relationship_id',
            )
        ); 
        var $validate = array(
            'to' => array(
                'relationshipExists' => array(
                    'rule' => array(
                        'relationshipExists',
                        ),
                    'message' => 'sorry you dont have a relationship with that user.'
                    ),
                ),
            );

        public function relationshipExists($check){ 
            $relationshipExists=$this->Relationship->find('count', array('conditions' => array('Relationship.partyone','Relationship.partytwo'=>$check)));
                if ($relationshipExists == true) {
                    return TRUE;
                    }
                else
                    return FALSE;
                    }}

-関係モデル

<?php

class Relationship extends AppModel
{

    var $name = 'Relationship';
    public $useTable = 'relationships_users';
    public $hasMany = array(
        'Invoice' =>
            array(
                'className'              => 'Invoice',
                'joinTable'              => 'invoice',
                'foreignKey'             => 'invoice_id'));
    public $belongsTo = array(
        'User' =>array(
            'className' => 'User',
            'foreignKey' =>'partyone','partytwo',
            'associationForeignKey'  => 'username',
            )); 

    var $validate = array(
        'date' => array(
            'rule' => array(
                'datevalidation',
                'systemDate'
            ),
            'message' => 'Current Date and System Date is mismatched'
        ),
        'partytwo' => array(
            'userExists' => array(
                'rule' => array(
                    'userExists',
                ),
                'message' => 'That username doesnt exist.'
            ),
        ),
    );

    function datevalidation($field = array(), $compare_field = null)
    {
        if ($field['date'] > $compare_field)
            return TRUE;
        else
            return FALSE;
    }

    function userExists($check)
    {   
        $userExists = $this->User->find('count', array('conditions' => array('User.username'=>$check)));
        if ($userExists == 1) {
           return TRUE;
        }
        else
            return FALSE;
    }

}
4

2 に答える 2

1

あなたの発見は面白いことをするでしょう...

$relationshipExists=$this->Relationship->find('count', array(
  'conditions' => array(
    'Relationship.partyone',
    'Relationship.partytwo' => $check
  )
));

これはおそらく次のようなものを生成します

SELECT COUNT(*) FROM relationships as Relationship 
  WHERE Relationship.partyone = 0
  AND Relationship.partytwo = Array;

これは、Relationship.partyoneに何も渡さず、partytwoに配列を渡していないためです。次のように変更する必要があります。

$relationshipExists=$this->Relationship->find('count', array(
  'conditions' => array(
    'Relationship.partyone <>' => null,
    'Relationship.partytwo' => current($check) // get the value from the passed var
  )
));

これは次のようなものを生成します

SELECT COUNT(*) FROM relationships as Relationship 
  WHERE Relationship.partyone IS NOT NULL
  AND Relationship.partytwo = 'fieldvalue';

$check検証メッセージに送信されている値を理解するためにデバッグし、検索結果をデバッグして結果を確認します。また、SQLログを見て、生成されたSQLを確認してください。これにより、何が起こっているのかをよりよく理解できるはずです。

于 2012-05-29T16:21:27.100 に答える
0

どのバージョンのCakePHPを使用していますか?

とにかく、テーブルの名前は複数形のモデル名であるため、「public $ useTable='invoices';」は必要ありません。また、デフォルトでは'id'であるため、 "public $ primaryKey='id';"は必要ありません。

このリンクを確認してください

于 2012-05-29T16:04:06.027 に答える