Soru Laravel 4 Doğrulama benzersiz (veritabanı) akımı yoksay


Bir kullanıcı düzenleme formunda doğrulama yapıyorum ve kullanıcı adı veritabanında benzersiz olup olmadığını doğrulama kontrolüne sahip değilim.

Ancak, bir kullanıcı düzenlendiğinde ve kullanıcı adı alanını değiştirmediğinizde, alanın benzersiz olup olmadığını kontrol etmeye devam eder.

Değişmeyen mevcut kullanıcı adını yok saymak için bir labirent yolu var mı?


20
2018-06-07 04:25


Menşei




Cevaplar:


Dokümanlar daha fazla okumalıydı, elbette laravel 4 bunu yapıyor ...

Ne vardı

$rules = array('username' => 'required|unique:users');

Neyim var

$rules = array('username' => 'required|unique:users,username,'.$id);

Doğrulayıcıya, yukarıdaki gibi bir kimliği göz ardı etmesini söyleyebilirsiniz.


28
2018-06-07 04:25



Ayrıca, $ rules = array ('kullanıcı adı' => 'gerekli | benzersiz: kullanıcılar, kullanıcı adı, {{$ id}}'); - Meddie
Bu bir ton yardımcı oldu. Teşekkürler! - dcolumbus
Bunu yapmanın daha iyi bir yolu olmalı (ve daha önce yaptığımı düşünüyorum, hatırlayamıyorum). Her model kuralını bir $rules özniteliği ve güncelleme sırasında benzersizliği kontrol ederken otomatik olarak kendini atlamak istiyorum. - Mauro


Bu çözüm benim için çalıştı:

protected  $rules = array(
    'email' => "required|email|unique:users,email,:id",
);

9
2018-03-23 14:36



Bu Laravel 5.0 üzerinde iyi çalışıyor. ": İd" göstergesinin kullanılması, kaydın kimliğinin ne olduğunu bilmenize gerek olmadığı anlamına gelir. Doğrulama kuralları statik olarak tanımlandığında özellikle kullanılır - bir yapılandırma dosyasında veya statik $rules elverişli bir model dizisi ve doğrulama noktasında bilseniz bile, güncelleme kaydı kimliğini geçmek için kodda hiçbir yer yoktur. - Jason
Bu benim için işe yaramazdı, bunun işe yaraması için bence bir şey yapmalısın bu. - Arda


Laravel 4.1 için uzatırsanız Illuminate\Validation\Validator sınıfı, geçersiz kıl validateUnique() yöntem şöyle:

/**
 * Validate the uniqueness of an attribute value on a given database table.
 *
 * If a database column is not specified, the attribute will be used.
 *
 * @param  string  $attribute
 * @param  mixed   $value
 * @param  array   $parameters
 * @return bool
 */
protected function validateUnique($attribute, $value, $parameters)
{
    $this->requireParameterCount(1, $parameters, 'unique');

    $table = $parameters[0];

    // The second parameter position holds the name of the column that needs to
    // be verified as unique. If this parameter isn't specified we will just
    // assume that this column to be verified shares the attribute's name.
    $column = isset($parameters[1]) ? $parameters[1] : $attribute;

    // If the specified ID column is present in the data, use those values; otherwise,
    // fall back on supplied parameters.
    list($idColumn, $id) = [null, null];
    if (isset($parameters[2])) {
        list($idColumn, $id) = $this->getUniqueIds($parameters);

        if (strtolower($id) == 'null') $id = null;
        else if (strtolower($id) == 'id' && isset($this->data[$idColumn])) $id = $this->data[$idColumn];
    }
    else if (isset($this->data['id'])) {
        $idColumn = 'id';
        $id = $this->data[$idColumn];
    }

    // The presence verifier is responsible for counting rows within this store
    // mechanism which might be a relational database or any other permanent
    // data store like Redis, etc. We will use it to determine uniqueness.
    $verifier = $this->getPresenceVerifier();

    $extra = $this->getUniqueExtra($parameters);

    return $verifier->getCount(

        $table, $column, $value, $id, $idColumn, $extra

    ) == 0;
}

Doğrulayıcı kurallarınızda bunu yapabilirsiniz ( id doğrulama verilerinde mevcut alan - bu en yaygın kullanımdır:

$rules = 'unique:model,field';

bu (kontrol edecek id doğrulama verilerinde mevcut alan) (yukarıdakilere eşdeğer):

// specifying anything other than 'id' or 'null' as the 3rd parameter
// will still use the current behavior
$rules = 'unique:model,field,id'; 

veya bu (kontrol edecek idColumn doğrulama verilerinde mevcut alan):

// specifying anything other than 'id' or 'null' as the 3rd parameter
// will still use the current behavior
$rules = 'unique:model,field,id,idColumn';

1
2017-08-13 02:30





Merhaba, doğrulayıcıyı bir hizmet olarak kullanabilir veya mantığı kopyalayabilir ve ihtiyacınızı buna göre uygulayabilirsiniz.

$valitator = MyCustomValidator::make()->on('update')->setCurrent($id); 

giriş: https://github.com/bradleySuira/laravel-context-validator/blob/master/examples/unique-on-update.php


0
2018-02-06 05:46



Undefined yöntemine çağrı :: make () - xcy7e 웃
Belki de örnekte yer alan ad alanı App \ Services \ Validators \ EquipmentTypeValidator; kullanım anahtar kelimesini eklemelisiniz - Bradley