2014-11-24 29 views
5
में एक से अधिक डेटा डालने के लिए updateOrCreate का उपयोग

मैं LaravelEloquent ORMLaravel

$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); 

उपरोक्त कोड ठीक काम करता है में कई प्रविष्टियाँ सम्मिलित करने के लिए निम्नलिखित डालने सरणी का इस्तेमाल किया और डेटाबेस में डेटा सरणी सम्मिलित करता है ।

मैं Model::updateOrCreate के उपयोग सीखा है और मेरी मॉड्यूल में से कुछ में इसे सफलतापूर्वक इस्तेमाल किया है (यानी)

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

मेरा प्रश्न तो यह है कि मैं इसमें Model::updateOrCreate इस्तेमाल कर सकते हैं कि कैसे ऊपर डालने के स्निपेट संपादित करना है। मेरे $attributes फ़ील्ड 'fk_workouts_id', 'fk_users_id', 'fk_exercises_id' और शेष $values में परिवर्तित होने के लिए हैं।

मुझे नहीं पता कि इसे कैसे कार्यान्वित किया जाए। Pls मदद ...

+0

सुवक्ता सम्मिलित नहीं कर सकते/अद्यतन एकाधिक पंक्तियों, आप एक एक करके उन्हें एक कार्रवाई करने के लिए की जरूरत है। 'डालने' विधि वास्तव में 'क्वेरी \ बिल्डर' है और यह बिल्कुल स्पष्ट सुविधाओं का उपयोग नहीं करती है (उदाहरण के लिए टाइमस्टैम्प और इसी तरह)। –

+0

'Eloquent' या' Query \ Builder' में कोई अन्य तरीका है जो डेटा उपस्थिति @JarekTkaczyk अगर मैं प्रविष्टि या अद्यतन बना सकता हूं।क्योंकि मुझे अपडेट करने की आवश्यकता है या लगभग 20-50 डेटा तैयार करें क्या यह एक-एक करके ऐसा करने का एक अच्छा अभ्यास है ?? – Ronser

+0

किस तरह से अच्छा अभ्यास? आप या तो कोड की 3 लाइनें लिख सकते हैं और एलोक्वेंट नौकरी कर सकते हैं, या कोड की 13 लाइनें कह सकते हैं, जहां आप नौकरी करते हैं। Eloquent 'firstOrNew' विधि है, जो जाने का रास्ता है। –

उत्तर

6

आप की तरह कोशिश कर सकते हैं,

पहला तरीका

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

यह अगर पाया तो इसे वापस उपयोगकर्ता name=satish के लिए जाँच करेगा। यदि नहीं मिला तो नया बनाएं और वापस आएं। फिर आप फ़ील्ड मान सेट कर सकते हैं।

इस लिंक को चेक करें। http://laravel.com/docs/4.2/eloquent#insert-update-delete

दूसरा रास्ता mannually रिकॉर्ड की जाँच करें मौजूद है।

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

    } else { 
     //update your record 
    } 

UPDATED

तुम भी updateOrCreate उपयोग कर सकते हैं - एक मौजूदा मॉडल को अपडेट करने या यदि कोई भी मौजूद है एक नया मॉडल बना सकते हैं। updateOrCreate मॉडल को जारी रखता है, इसलिए save() पर कॉल करने की आवश्यकता नहीं है।

उदाहरण

// 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

मैं तुम्हें laravel के कस्टमाइज़ किए गए ढांचे के साथ काम कर रहे हैं लगता है तो आप UpdateOrCreate विधि है, क्योंकि इस तरह के laravel तरीके प्रदान नहीं करता है, तो मेरी धारणा सच है की तुलना में नीचे लिखा कोड आपके आवेदन के लिए उपयोगी हो सकता है ख

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); 
    } 
} 

लेकिन यह काम कर सकते हैं, तो आप नीचे दिए गए कोड के साथ प्रयास करें से अनुकूलित ढांचा इस तरह उपयोग नहीं कर रहे ठीक

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 
    } 
} 

अच्छी किस्मत ... :)

+0

प्रश्न 'foreach' दाएं भर में निष्पादित किए जाएंगे ?? प्रश्नों को कम करने का कोई तरीका है ?? – Ronser

+0

मुझे नहीं लगता कि हमारे पास इस आवश्यकता का समाधान होगा। लेकिन अगर मैंने पाया कि निश्चित रूप से आप वापस लौट आएगा .... – Neo