क्या yii2 में मॉडलों की एक सरणी (उसी वर्ग के) में सभी मॉडलों में एक विशिष्ट विशेषता मान सेट करने का कोई तरीका है? मैंने खोज की है लेकिन दुर्भाग्य से कुछ भी प्रासंगिक नहीं मिला। अग्रिम में धन्यवाद!

0
user2511599 12 जुलाई 2018, 12:53
क्या आपने foreach का उपयोग करने की कोशिश की?
 – 
rob006
12 जुलाई 2018, 12:58
नहीं... लेकिन आप मूल रूप से सही हैं। मैं बस उम्मीद कर रहा था कि शायद Arrayhelper::setValues जैसा कुछ हो।
 – 
user2511599
12 जुलाई 2018, 13:00

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 दस्तावेज़ीकरण के लिए

0
mrateb 12 जुलाई 2018, 14:45
मैं पहले से ही loadMultiple कर रहा हूं और उसके बाद मैं सभी मॉडलों में एक निश्चित विशेषता को अपडेट करना चाहूंगा
 – 
user2511599
13 जुलाई 2018, 08:57
क्या आप उपरोक्त प्रश्न में अपना कोड जोड़ सकते हैं। ये सहायता करेगा :)
 – 
mrateb
13 जुलाई 2018, 10:36

शास्त्रीय फ़ोरैच लूप के बजाय आप 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();
}
0
haveyaseen 16 जुलाई 2018, 17:33
हाँ, लेकिन उसके लिए मॉडलों को पहले ही सहेज लिया जाना चाहिए। यही वह बिंदु है जिसे मैं सहेजने से पहले करना चाहता हूं।
 – 
user2511599
16 जुलाई 2018, 16:08
आप इसे Model::loadMultiple के साथ कर सकते हैं, mrateb का उत्तर अधिक समझ में आता है।
 – 
haveyaseen
16 जुलाई 2018, 17:25
Model::loadMultiple का उपयोग करके इसे करने का सही तरीका जोड़ा गया।
 – 
haveyaseen
16 जुलाई 2018, 17:34