2013-06-07 12 views
28

Sto importando un mucchio di voci csv nel mio database con laravel 4.laravel 4: facendo una combinazione di valori/colonne univoche

non posso davvero puntare a una colonna che deve essere unico, è una combinazione di 5 colonne che lo rende unico. Tuttavia: come si definisce questo in Laravel?

Opzione 1: generatore di schemi
È possibile utilizzare il metodo $ tavola-> unico ('e-mail'), ma che sembra solo per permettere una colonna, non una combinazione di colonne.

Opzione 2: Convalida
meno preferibile, ma ho potuto convalidare il modello prima di inserirla. Tuttavia, ancora una volta, usando le regole di convalida "unique: [table]", verrà restituito un errore quando solo uno dei valori della colonna non è univoco, non una combinazione di essi.

Qualcuno può dirmi come dovrei fare questo?
Sono sicuro che mi manca qualcosa, ma potrei usare una spinta nella direzione giusta :-)

Grazie,

Dieter

risposta

72

È possibile combinare:

$table->unique(array('email','name')); 

E praticamente tutto in Laravel accetterà gli array per fare tutto il necessario con "più di uno".

+8

Ma come convalidare le chiavi univoche composite, intendevo la seconda parte usando la convalida di laravel. Non riuscivo a capire l'esempio dal sito Web di laravel? – HariHaraSudhan

+0

@HariHaraSudhan Sì, penso di avere anche la stessa [Domanda] (http: // StackOverflow.it/questions/26683762/how-to-add-combined-unique-fields-validator-rule-in-laravel-4) –

+0

Laravel 5.4 utilizza la stessa sintassi. –

7

Utilizzare il metodo unique() dello Schema Builder per definire il modello di dati, come indicato da Antonio.

Inoltre, se si desidera utilizzare la convalida del modello, in considerazione mia abitudine Validator regola per molteplici UNIQUE indici: https://github.com/felixkiss/uniquewith-validator

+1

Grazie per la regola del validatore personalizzato! Userò quello sopra il vincolo del DB, sembra sbagliato fare affidamento su un'eccezione DB per il flusso del programma. – Dieter

0

si può provare questo

$table->string("name"); 
$table->string("email")->unique("name") 
+1

Non capisco. Perché questo renderebbe l'e-mail e il nome univoci in coppia? – Cristian

0

So che questa domanda è per laravel 4 , ma ho appena trovato questo per le ricerche e trovato una soluzione per Laravel> = 5.3

Eccolo:

Naturalmente, la migrazione può essere simile

$table->unique(array('email','name')); 

Poi per convalidare questa, non è necessario utilizzare regole personalizzate, regole appena avanzate:

'email' => Rule::unique('users')->where(function ($query) use ($request) { 
    return $query->where('name', $request->name); 
}), 

Naturalmente, si consiglia di prima convalidare il nome. Il nome dovrebbe essere richiesto in modo che tu possa finire con qualcosa del genere:

'name' => 'required|max:255', 
'email' => Rule::unique('users')->where(function ($query) use ($request) { 
    return $query->where('name', $request->name); 
}), 

Spero che sia d'aiuto.