2014-12-08 7 views
28

तो, क्या ActiveRecord के साथ एक क्वेरी में एकाधिक पंक्तियां डालना संभव है, या इसके लिए डीएओ का उपयोग करना बेहतर है?ActiveRecord बैच डालने (yii2)

उत्तर

42

आप yii\db\Command की विधि का उपयोग कर सकते हैं। विवरण देखें hereActiveRecord के साथ इसका उपयोग करते समय सुनिश्चित करें कि डालने से पहले सभी डेटा मान्य करें।

$rows = []; 
foreach ($models as $model) { 
    if (!$model->validate()) { 
     // At least one model has invalid data 

     break; 
    } 

    $rows[] = $model->attributes; 
} 

मॉडल सत्यापन आपकी $rows सरणी के निर्माण के लिए ArrayHelper का उपयोग करके उपरोक्त शॉर्ट कोड कर सकते हैं की आवश्यकता नहीं है, तो:

आप यह मानते हुए $ वर्ग Post के साथ मॉडल, इसे इस तरह किया जा सकता है की सरणी है।

use yii\helpers\ArrayHelper; 

$rows = ArrayHelper::getColumn($models, 'attributes'); 

फिर बस बैच डालने निष्पादित करें:

$postModel = new Post; 

Yii::$app->db->createCommand()->batchInsert(Post::tableName(), $postModel->attributes(), $rows)->execute(); 

पी.एस. $postModel अभी एटिरबूट नाम सूची खींचने के लिए उपयोग किया जाता है, आप इसे अपने $ मॉडल सरणी में किसी मौजूदा $ मॉडल से भी खींच सकते हैं।

आप सभी आप इसे निर्दिष्ट कर सकते हैं जिम्मेदार बताते हैं जब $rows सरणी भरने सम्मिलित करने के लिए की जरूरत नहीं है:

$rows[] = [ 
    'title' => $model->title, 
    'content' => $model->content, 
]; 

भूल ['title', 'content'] को $postModel->attributes को बदलने के लिए न करें।

बड़ी मात्रा में विशेषताओं के मामले में आप डालने के लिए सटीक विशेषताओं को निर्दिष्ट करने के लिए कुछ सरणी फ़ंक्शंस का उपयोग कर सकते हैं।

+0

तो, जवाब नहीं है? मुझे डीएओ का उपयोग करना चाहिए। – user1561346

+0

मुझे लगता है कि वर्तमान में ActiveRecord इस बॉक्स के बाहर का समर्थन नहीं करता है। आप कुछ और शोध कर सकते हैं, लेकिन मुझे यह नहीं मिल रहा है। – arogachev

+1

$ postModel-> गुण $ post होना चाहिए मॉडल-> विशेषताओं() – Dodo