क्या yii2 में मॉडलों की एक सरणी (उसी वर्ग के) में सभी मॉडलों में एक विशिष्ट विशेषता मान सेट करने का कोई तरीका है? मैंने खोज की है लेकिन दुर्भाग्य से कुछ भी प्रासंगिक नहीं मिला। अग्रिम में धन्यवाद!
2 जवाब
आप Model::loadMultiple( $models, $data, $formName = null );
का उपयोग कर सकते हैं
यह एक उदाहरण है कि आप यह कैसे कर सकते हैं:
$numberOfModelsInArray = sizeof($myDataArray);
$myModels = [];
for ($i = 0; $i < $numberOfModelsInArray; $i++) {
$myModels[] = new myModelForm();
}
VariantsForm::loadMultiple($myModels, $myDataArray, '');
LoadMultiple() के बारे में अधिक जानने के लिए आप देख सकते हैं। https://www.yiiframework.com/doc/api/2.0/yii-base-model#loadMultiple()-detail दस्तावेज़ीकरण के लिए
loadMultiple
कर रहा हूं और उसके बाद मैं सभी मॉडलों में एक निश्चित विशेषता को अपडेट करना चाहूंगा
शास्त्रीय फ़ोरैच लूप के बजाय आप array_walk
का भी उपयोग कर सकते हैं:
\array_walk($carArray, function(&$car) { $car->engine = 'electric'; });
दूसरा तरीका यह होगा कि Model::loadMultiple
को बार-बार सरणी के साथ प्रयोग किया जाए:
Model::loadMultiple(
$carArray,
\array_fill(0, count($carArray), ['engine' => 'electric']),
''
);
Yii को दूसरे पैरामीटर की सटीक संरचना की अपेक्षा करने के लिए अंतिम पैरामीटर एक खाली स्ट्रिंग है।
स्पष्टीकरण के बाद पुराना:
ActiveRecord
पर एक स्थिर विधि है जिसे updateAll
:
Car::updateAll(['engine' => 'electric'], ['manufacturer' => 'Tesla']);
// UPDATE car SET engine = 'electric' WHERE 'manufacturer' = 'Tesla'
यह टेस्ला द्वारा निर्मित सभी कारों की engine
विशेषता को 'electric'
पर सेट कर देगा। यदि आप दूसरे तर्क में शर्त निर्दिष्ट नहीं करते हैं, तो सभी कारें अपडेट हो जाएंगी।
यदि आपको पूरी तरह से संसाधित सरणी के लिए ऐसा करने की ज़रूरत है, तो आप प्राथमिक कुंजी मानों को मैप कर सकते हैं और उन्हें इसके बजाय मान के रूप में पास कर सकते हैं। तब आपकी स्थिति एक WHERE id IN(...)
में बदल जाएगी।
$carArray = [$car1, $car2, $car3];
$carArrayIds = \array_map(function ($car) {
return $car->id;
}, $carArray);
Car::updateAll(['engine' => 'electric'], ['id' => $carArrayIds]);
// UPDATE car SET engine = 'electric' WHERE 'id' IN (1, 2, 3)
और, अंतिम लेकिन कम से कम, यदि इनमें से कोई भी संभव नहीं है, तो एक ही डेटाबेस लेनदेन में सभी मॉडलों को अपडेट करने का प्रयास करें।
$transaction = Yii::$app->db->beginTransaction();
try {
foreach ($carArray as $car) {
$car->engine = 'electric';
if ($car->update() !== 1) {
throw new \RuntimeException('Single car update failed');
}
}
} catch (\Exception $e) {
$transaction->rollback();
}
Model::loadMultiple
के साथ कर सकते हैं, mrateb का उत्तर अधिक समझ में आता है।
Model::loadMultiple
का उपयोग करके इसे करने का सही तरीका जोड़ा गया।
संबंधित सवाल
नए सवाल
php
PHP एक व्यापक रूप से उपयोग किया जाता है, उच्च-स्तरीय, गतिशील, वस्तु-उन्मुख, और व्याख्या की गई स्क्रिप्टिंग भाषा मुख्य रूप से सर्वर-साइड वेब विकास के लिए डिज़ाइन की गई है। PHP भाषा के बारे में सवालों के लिए इस्तेमाल किया।
Arrayhelper::setValues
जैसा कुछ हो।