سؤال

لدي نموذج تسجيل يمكن للمستخدمين من خلاله ملء عنواني بريد إلكتروني (email1 وemail2).متطلبات التسويق هي أن تكون فريدة (فريدة كما لو كان لدينا 10 مستخدمين، فسيكون هناك 10*2=20 عنوان بريد إلكتروني فريد).

النظام مبني بالفعل على cakephp، لذا ما أود معرفته هو، هل هناك شيء مشابه لميزة isUnique (فريدة في حقل واحد) يمكنها القيام بذلك مباشرة خارج الصندوق؟أم أنني محكوم علي بترميز هذا بنفسي؟شكرا لك مقدما.

يحرر:بناءً على مثال ريتشارد، نجح هذا الأمر بالنسبة لي:

function checkUnique($data, $fields) {
    if (!is_array($fields)) {
        $fields = array($fields);
    }
    foreach($data as $key) {
        $checks = $key;
    }
    if (empty($checks)) {
      return true;  //allow null
    }
    foreach($fields as $key) {
        $tmp[$key] = $checks;
    }
    if (isset($this->data[$this->name][$this->primaryKey])) {
        $tmp[$this->primaryKey] = "<>".$this->data[$this->name][$this->primaryKey];
    }
    return $this->isUnique($tmp);
}
هل كانت مفيدة؟

المحلول

ونشرت لي حل لهذه المجموعة على جوجل للكيك:

HTTP: // groups.google.com/group/cake-php/browse_frm/thread/b3a1e4ae3eeb6091/e168f54bac27c163؟lnk=gst&q=checkUnique#e168f54bac27c163

وإضافة ما يلي إلى AppModel الخاص بك:

        /** 
         * checks is the field value is unqiue in the table 
         * note: we are overriding the default cakephp isUnique test as the 
original appears to be broken 
         * 
         * @param string $data Unused ($this->data is used instead) 
         * @param mnixed $fields field name (or array of field names) to 
validate 
         * @return boolean true if combination of fields is unique 
         */ 
        function checkUnique($data, $fields) { 
                if (!is_array($fields)) { 
                        $fields = array($fields); 
                } 
                foreach($fields as $key) { 
                        $tmp[$key] = $this->data[$this->name][$key]; 
                } 
                if (isset($this->data[$this->name][$this->primaryKey])) { 
                        $tmp[$this->primaryKey] = "<>".$this->data[$this->name][$this- 
>primaryKey]; 

                } 
                return $this->isUnique($tmp, false); 
        } 
} 

ويستخدم في التحقق من صحة النموذج الخاص بك:

        var $validate = array( 
                "name"=>array( 
                        "unique"=>array( 
                                "rule"=>array("checkUnique", array("name", "institution_id")), 
                                "message"=>"A contact with that name already exists for that 
institution" 
                        ) 
                ) 
       ); 

نصائح أخرى

وcheckUnique فقط يمكن أن يكتب مجمع لisUnique.

class AppModel extends Model {
    public function checkUnique($ignoredData, $fields, $or = true) {
        return $this->isUnique($fields, $or);
    }
}

ويستخدم في التحقق من صحة النموذج الخاص بك:

public $validate = array(
    'name' => array(
        'unique' => array(
            'rule' => array('checkUnique', array('name', 'institution_id'), false), 
            'message' => 'A contact with that name already exists for that 
institution'
        )
    )
);

من الوثائق للكيك 2.0:

ويمكنك التحقق من صحة أن مجموعة من المجالات هي فريدة من نوعها من خلال توفير مجالات متعددة وتعيين $ أو إلى false:

public $validate = array(
    'email' => array(
        'rule' => array('isUnique', array('email', 'username'), false),
        'message' => 'This username & email combination has already been used.'
    )
);

تأكد من أن تشمل الحقل الأصلي في قائمة الحقول عند اتخاذ قاعدة فريدة من نوعها عبر حقول متعددة.

إذا لم يتم تضمين حقل مدرجة في بيانات نموذج، ثم يتم التعامل معها كقيمة فارغة. يجوز لك أن تنظر بمناسبة الحقول المدرجة على النحو المطلوب.

ونعم ولا.

نعم، سيكون لديك إلى رمز ذلك بنفسك، ولكن ضمن المكون التحقق من صحة للكيك.

والمكون التحقق من صحة لديها آلية للسماح قواعد التحقق من صحة مخصصة. أساسا، يمكنك وضع اسم دالة داخل $ التحقق من صحة (مثل تفعل عادة). لديك لتحديد وظيفة. في هذه الحالة، انها جميلة بسيطة (مجرد فرض شرط isUnique المزدوج الخاص بك).

HTTP: //book.cakephp كافيه / 2.0 / EN / نماذج /-validation.html البيانات # العرف التحقق من صحة قواعد

في خطر التعرض للضرب على الرأس والكتفين لتقديم أ غير-CakePHP الحل، اسمحوا لي أن أقدم ما يلي.

قم بإنشاء فهرس فريد في قاعدة البيانات الخاصة بك على أي عدد من الأعمدة التي تحتاجها.

بناء جملة SQL القياسي لهذا هو:

create unique index {IndexName} on {Table} ({Column}, {Column}, ...)

ضع الأمر "$this->Model->save()" داخل كتلة "try/catch".في كتلة "catch"، اختبر الاستثناء الخاص برمز الخطأ.في MySQL، انتهاك المفتاح الفريد هو رمز الخطأ 23000، ولكن يجب أن تكون مستعدًا للأخطاء المحتملة الأخرى أيضًا.

إنها سريعة وبسيطة ولا تتضمن حساب أقواس المصفوفة.

يجب دائماً ضع رمز الوصول إلى قاعدة البيانات داخل كتلة "try/catch" على أي حال.يجب أن يتضمن جزء من معالجة الاستثناء تسجيل أية رسائل خطأ غير متوقعة.لا يمكنك أن تتوقع أن يقوم CakePHP بذلك كل شئ لك.

وبقدر ما أتذكر، لديك لهذا النوع من إنفاذ باستخدام طريقة beforeSave في النموذج. كان لي شرط أن الجسم يكون ما لا يقل عن واحد من مجموعة N FKS، وأنا لا يمكن أن تفعل ذلك إلا بهذه الطريقة.

وتحرير: محاولة هذا الموضوع لمعرفة ما إذا كان أي شيء هناك يحل مشكلتك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top