2014-11-24 12 views
5

Ho usato il seguente inserto matrice per inserire più voci laravelEloquent ORMUtilizzo updateOrCreate per l'inserimento dati multiplo in laravel

$i = 0; 
foreach($exerciseValArray as $kkey=>$exerciseValue){ 
    if($exerciseValue['exercise'] =='' || $exerciseValue['section_type'] == ''){ 
     return Response::JSON(array('errors'=>array('Error in workout exercise section'))); 
    } 
    $exerciseData = explode(',',$exerciseValue['exercise']); 
    foreach($exerciseData as $exerciseid){ 
     $insertArray[$i]['fk_workouts_id'] = $id; 
     $insertArray[$i]['fk_users_id'] = $userId; 
     $insertArray[$i]['fk_exercises_id']= $exerciseid; 
     $insertArray[$i]['section']  = $exerciseValue['section_type']; 
     $insertArray[$i]['status']   = 1; 
     $insertArray[$i]['item_index']  = $index+$kkey+1; 
     $insertArray[$i]['updated_at']  = $workoutDetails['updated_at']; 
     $i++; 
    } 
} 
WorkoutExercise::insert($insertArray); 

Il codice sopra funziona bene e inserisce schiera di dati al database .

ho imparato l'uso di Model::updateOrCreate e lo ha utilizzato in alcuni dei miei moduli con successo (cioè)

Model::updateOrCreate($attributes = array('key' => 'value'), $values = array('key' => 'value')); 

La mia domanda è come modificare il frammento di sopra inserto in modo che potessi usare Model::updateOrCreate in esso. I miei campi $attributes sono "fk_workouts_id", "fk_users_id", "fk_exercises_id" e il resto nello $values da modificare.

Non ho idea di come implementarlo. Pls aiuto ...

+0

Eloquent non può inserire/aggiornare più righe, è necessario elaborarle una alla volta. Il metodo 'insert' è in effetti' Query \ Builder's e non usa affatto caratteristiche Eloquent (ad esempio timestamp e così via). –

+0

c'è un altro modo in 'Eloquent' o' Query \ Builder' che potrei creare una voce o un aggiornamento se la presenza dei dati è @JarekTkaczyk.Perché ho bisogno di aggiornareOrCreare quasi 20-50 dati è una buona pratica farlo uno per uno ?? – Ronser

+0

Buone pratiche in che modo? Puoi scrivere 3 linee di codice e lasciare che Eloquent faccia il lavoro, o dire 13 linee di codice, dove fai il lavoro. Eloquent ha il metodo 'firstOrNew', che è la strada da percorrere. –

risposta

6

Si può provare come,

primo modo

$user = User::firstOrNew(array('name' => 'satish')); 
$user->field = 'value'; 
$user->save(); 

Controllerà per l'utente name=satish se trovato poi restituirlo. Se non lo trovi, creane uno nuovo e restituiscilo. Quindi puoi impostare i valori dei campi.

Controlla questo collegamento. http://laravel.com/docs/4.2/eloquent#insert-update-delete

Secondo Modo mannually Controllare record è esiste.

$arr=array('field'=>"value"); 
$row = User::find($id); 
    if ($row === null) { 
     //Insert your record 

    } else { 
     //update your record 
    } 

AGGIORNATO

È inoltre possibile utilizzare updateOrCreate - aggiornare un modello esistente o di creare un nuovo modello se non esiste. updateOrCreate persiste il modello, quindi non è necessario chiamare save().

Esempio-

// If there's a flight from Oakland to San Diego, set the price to $99. 
// If no matching model exists, create one. 
$flight = App\Flight::updateOrCreate(
    ['departure' => 'Oakland', 'destination' => 'San Diego'], 
    ['price' => 99] 
); 
1

penso che si sta lavorando con il quadro personalizzata di laravel in modo da avere metodo UpdateOrCreate perché laravel non fornisce tali metodi se la mia ipotesi è vero che il codice qui sotto scritto May B utile per la vostra applicazione

foreach($exerciseValArray as $kkey=>$exerciseValue){ 

    if($exerciseValue['exercise'] =='' || $exerciseValue['section_type'] == ''){ 
    return Response::JSON(array('errors'=>array('Error in workout exercise section'))); 
    } 
    $exerciseData = explode(',',$exerciseValue['exercise']); 
    $attr_array = array('fk_workouts_id','fk_users_id','fk_exercises_id','section','status','item_index','updated_at'); 

    foreach($exerciseData as $exerciseid){ 

     $val_array = array($userId,$exerciseid,$exerciseValue['section_type'],1,$item_index,$workoutDetails['updated_at']); 
     WorkoutExercise::updateOrCreate($attr_array,$val_array); 
    } 
} 

Ma se non si utilizza questo tipo di quadro personalizzato rispetto riprova con il codice qui sotto, può funzionare bene

foreach($exerciseValArray as $kkey=>$exerciseValue){ 

    if($exerciseValue['exercise'] =='' || $exerciseValue['section_type'] == ''){ 
    return Response::JSON(array('errors'=>array('Error in workout exercise section'))); 
    } 
    $exerciseData = explode(',',$exerciseValue['exercise']); 

    foreach($exerciseData as $exerciseid){ 

    $item_index = $index+$kkey+1; 

    // Retrieve the record by the fk_workouts_id, or create it if it doesn't exist... 
    $exercise = WorkoutExercise::firstOrCreate($attributes = array('fk_workouts_id' => $id)); 

    /* assign the values of other fields to store in database table*/ 
    $exercise->fk_users_id  = $userId; 
    $exercise->fk_exercises_id = $exerciseid; 
    $exercise->section   = $exerciseValue['section_type']; 
    $exercise->status   = 1; 
    $exercise->item_index  = $item_index; 
    $exercise->updated_at  = $workoutDetails['updated_at']; 
    $exercise->save(); // update the record 
    } 
} 

buona fortuna ... :)

+0

le query saranno eseguite in tutto il 'foreach' giusto ?? c'è un modo per ridurre al minimo le query ?? – Ronser

+0

Non penso che avremo la soluzione per questi requisiti. Ma se lo trovassi, tornerò sicuramente da te ... – Neo

Problemi correlati