3

ProductとProduct_Methodologyの2つのモデルがあります。私の製品編集ビューには、多くの方法論の1つを選択するか、まったく選択しない(最初のオプションを空にする)ためのフォーム選択フィールドがあります。私の製品テーブルには、INT(10) methodology_idフォームの選択フィールドから選択した方法論のIDで保存されるプロパティがあります。今日まですべてがうまく機能し、システムを調整する必要がありました。これ以降、方法論の選択はオプションになります。そこで、値methodology_idを許可するように製品テーブルのフィールドを変更し、モデルの検証ルールNULLを削除しました。not_empty

問題は、モデルを保存して、期待されるものではなく、空のオプションを選択すると、 (ゼロ)値NULLが得られることです。0

これに関する手がかりはありますか?どうもありがとうございました。はっきりしない場合はお知らせください。

4

4 に答える 4

6

方法論を選択するためにどのフォーム入力を使用していますか?それ<select>ですか?その場合、方法論が選択されていない場合、選択されたオプションの値はおそらく0に設定され、他のフォームデータとともに送信されます。

このような場合、モデルのメソッドを使用してカスタムフィルターを作成しfilters()、値がNULLのときに(PHPが処理するように)NULLに設定しますempty()。これは、次のようになります。

public function filters()
{
    return array(
        'methodology_id' => array(
            array('Filter::null', array(':value')),
        ),
    );
}

ここで、Filterは静的メソッドを持つヘルパークラスです。お気に入り...:

class Kohana_Filter {

    public static function null($value)
    {
        return (empty($value) ? NULL : $value);
    }

}

お役に立てれば :)

于 2011-06-01T20:58:19.670 に答える
1

送信されたフォームフィールドが空白の場合でも、NULLではなく空の値を持つ文字列です。これは、INTフィールドに保存されると0としてキャストされます(少なくともmysqlでは)。null値を保持するには、次のようにします。

$methodology_id = (empty($methodology_id) ? NULL : $methodology_id);
于 2011-06-02T08:18:45.083 に答える
1

フィールド値が空の文字列である場合にクロージャを使用してNULL値を返す例:

public function filters()
{
    return array(
        // Return a NULL value if empty string.
        'field_name' => array(
            array(function($value){
                return ($value === '') ? NULL : $value;
            }, array(':value')),
        )
    );
}
于 2011-11-18T09:59:01.367 に答える
0

選択ボックスのNone値のキーを0に設定する必要があります。

フィールドにはnot_emptyルールを残す必要があります。次に、値がproduct_methodologyの正当な値またはゼロのいずれかであることを確認するフィールドのルールが必要です。

ORMを拡張し、次の2つの機能があります。

public function exists_or_zero(Validation $validation, $field, $model, $pk)
{
    // The exists() function is only called if the field has a non-zero value
    if ($validation[$field]) {
        $this->exists($validation, $field, $model, $pk);
    }
}

public function exists(Validation $validation, $field, $model, $pk)
{
    if ( ! ORM::factory($model, $pk)->loaded()) {
        $validation->error($field, 'exists', array($validation[$field]));
    }
}

これらの関数を使用する場合、製品クラスのルールは次のようになります。

public function rules()
    return array(
        'product_methodology_id' => array(
            array('not_empty'),
            array(array($this, 'exists_or_zero'), array(':validation', ':field', 'product_methodology', ':value')),
        ),
    );
}
于 2011-06-02T01:25:06.957 に答える