2016-12-09 3 views
5

Ich habe Kommentare Tabelle:Wie wird die eindeutige Validierung in Laravel verwendet?

enter image description here

Mein Kommentar Controller, wo seine mit Werten von Form und es zu validieren und sie in der Datenbank zu speichern.

public function store(Request $request, $product_id) 
    { 
     $this->validate($request, array(
      'name' => 'required', 
      'email'=> 'required|email|unique:comments,product_id', 
      'comment' => 'required', 
      'rating' => 'required|integer' 
      )); 
     $product = Product::find($product_id); 
     $comment = new Comment(); 
     $comment->name = $request->name; 
     $comment->email = $request->email; 
     $comment->comment = $request->comment; 
     $comment->rating = $request->rating; 
     $comment->product()->associate($product); 

     $comment->save(); 
     Session::flash('success','Comment was added'); 
     return redirect()->route('product.show',[$product->id]); 
    } 

Ich versuche, so zu bestätigen, dass nur eindeutige E-Mail-ID auf jedem product_id Kommentar ist erlaubt, dass, wenn der Benutzer auf product_id 1 dann kommentiert hat bereits ist der gleiche Benutzer auf dieser ID nicht erlaubt ist, wieder zu kommentieren.

Ich versuchte

'email'=> 'required|email|unique:comments,product_id' 

Aber wie u etwa gleiche E-Mail-ID-Daten sehen kann, wurde für gleichen product_id eingetragen.

Ein Benutzer kann die Anzahl n der Seite product_id kommentieren, aber er kann nicht mehr kommentieren, sobald er diese ID kommentiert hat.

Gibt es eine Möglichkeit zu validieren, wenn E-Mail-Daten für eine bestimmte product_id in die Datenbank eingegeben wurden, dann ist es der gleichen E-Mail nicht erlaubt, das Formular zu senden.

enter image description here

Wenn verschiedene product_id E-Mail dann eingeben.

Danke.

Antwort

0

Dies ist nicht, wie unique Regel funktioniert. Für Ihre Aufgabe müssen Sie eine benutzerdefinierte Validierungsregel erstellen und manuell prüfen, ob ein Benutzer mit dieser E-Mail das Produkt bereits kommentiert hat.

https://laravel.com/docs/5.3/validation#custom-validation-rules

+0

können Sie bitte eine Beispielregel nach Problem erstellen oben, da ich nicht nach Lesen der Dokumentation herausfinden kann, wie ich bin nicht so mit Laravel erfahren . Vielen Dank. – Phoenix

0

Haben Sie unique_with benutzerdefinierte Validierung versuchen. Mai dieses Paket mit voller füllen Sie Ihre Anforderung. Sie können überprüfen und Beispiel here erhalten.

0

Es gibt keine Möglichkeit, dass Sie mehrere Spalten für die eindeutige Regel verwenden können. Sie müssen dies manuell überprüfen, indem Sie eine Abfrage auslösen.

2

schreiben diese in der Konsole

php artisan make:provider ValidationServiceProvider 

Dann ersetzen Sie App\Providers\ValidationServiceProvider mit

namespace App\Providers; 

use Validator; 
use App\Comment; 
use Illuminate\Support\ServiceProvider; 

class ValidationServiceProvider extends ServiceProvider 
{ 
    /** 
    * Bootstrap any application services. 
    * 
    * @return void 
    */ 
    public function boot() { 
    Validator::extend('unique_email_comment', function($attribute, $value, $parameters, $validator) { 
     return !Comment::where('email', $value)->where('product_id', $parameters[0])->exists(); 
    }); 
    } 

    /** 
    * Register the service provider. 
    * 
    * @return void 
    */ 
    public function register() { 
    // 
    } 
} 

Hinweis: - Bitte stellen Sie sicher das Modell App\Comment mit dem Namensraum des modalen Sie verwenden ersetzt Ihre Kommentar System.

Jetzt ist es zu Anbieter hinzufügen in config/app.php wie

App\Providers\ValidationServiceProvider::class, 

Jetzt können Sie die Existenz der Reihe nach validieren:

'email' => 'unique_email_comment:' . $productId; 

// or 
// 'email' => 'unique_email_comment:' . request()->get('product_id'); 

Sie können auch eine benutzerdefinierte Nachricht wie diese

hinzufügen
return [ 
    'email.unique_email_comment' => 'A comment has already been made for this product with the email provided'; 
] 

Bitte beachten Sie, dass ich den Code nicht getestet habe, aber dies sollte funktionieren, wenn alle Daten korrekt übergeben werden und alle Namespaces korrekt verwendet werden.

+0

@Phoenix Froh, dass ich helfen könne :) – prateekkathal

+0

wo ich benutzerdefinierte Nachricht hinzufügen – Phoenix

+0

einfach eine benutzerdefinierte machen '$ messages = [....]' und fügen Sie sie als dritter Parameter an 'Validator :: make()' wie 'Validator :: make ($ inputs, $ rules, $ messages)' – prateekkathal

0

Sie können die Validierungsregel unique verwenden. Reference

use Illuminate\Validation\Rule;

$this->validate($request, array(
    'name' => 'required', 
    'email'=> ['required', 'email', Rule::unique('comments', 'email')->where(function($query) { 
        $query->where('product_id', $product_id); 
       })], 
    ... 
)); 

Hope this helfen Ihnen

Verwandte Themen