php - क्यों डेटा के सेट लार्वाल मॉडल डुप्लिकेट और कैसे(यदि संभव हो)डेटा का केवल एक सेट है?




laravel object model query-builder (4)

मूल डेटा को गंदा जांच करने के लिए मॉडल को अनुमति देने के लिए संग्रहीत किया जाता है गंदा जांच आंतरिक रूप से डेटाबेस अपडेट को संभालने के लिए उपयोग की जाती है

यदि कोई मॉडल गंदे नहीं है और आप इसे सहेजने का प्रयास करते हैं, तो कोई अपडेट नहीं किया जाएगा। यदि कोई मॉडल गंदे है और आप इसे सहेजने का प्रयास करते हैं, तो केवल उन फ़ील्ड जो गंदे हैं, को अपडेट किया जाएगा।

यदि आप वाकई इस से छुटकारा चाहते हैं, तो आप मॉडल पर syncOriginal() और syncOriginalAttribute() तरीके को ओवरराइड कर सकते हैं। अगर आप ऐसा करते हैं, तो इसका मतलब यह होगा कि मॉडल को हमेशा गंदा माना जाएगा। getDirty() हमेशा सभी विशेषताओं को वापस करेगा, और isDirty() हमेशा true वापस करेगा।

यदि आप टाइमस्टैम्प का उपयोग करते हैं, तो आपको updateTimestamps() विधि को ओवरराइड करने की आवश्यकता होगी, अन्यथा आपके updated_at और created_at फ़ील्ड कभी भी सेट नहीं होंगे।

class Feedback extends Model
{
    // ...

    public function syncOriginal()
    {
        return $this;
    }

    public function syncOriginalAttribute($attribute)
    {
        return $this;
    }

    protected function updateTimestamps()
    {
        $time = $this->freshTimestamp();

        $this->setUpdatedAt($time);

        if (! $this->exists) {
            $this->setCreatedAt($time);
        }
    }

    // ...
}

कोड की समीक्षा करते समय तत्काल स्पष्ट नहीं होने वाले अन्य नतीजे भी हो सकते हैं।

हालांकि, यह सब कहने के बावजूद, अगर आपको स्मृति के विषय में यह चिंता हो रही है, तो आपको अपने दृष्टिकोण और आप क्या करने की कोशिश कर रहे हैं, इसके बारे में दूसरा विचार करना पड़ सकता है। क्या आपको वाकई 1000 की प्रतिक्रिया को एक बार में लोड करना है? क्या यह एक आपरेशन है, जिसे chunk जा सकता है? क्या यह काम है कि कतार में व्यक्तिगत नौकरियों द्वारा बेहतर सेवा होगी? आदि...

यह सुविधाजनक है कि लार्वेल मॉडल एक ऐसा तरीका प्रदान करता है जिससे यह परिणाम किसी अन्य संबद्ध तालिका से निकाल सकता है।

उदाहरण के लिए, मेरे पास आइटम नामक एक तालिका है और एक दूसरी तालिका है जिसे फीडबैक कहा जाता है, जहां प्रतिक्रिया तालिका आइटम तालिका में एक आइटम के फीडबैक को स्टोर करती है। इसलिए, आईडी 1 के साथ आइटम के सभी फीडबैक प्राप्त करने के लिए, मैं करूँगा:

Item::find(1)->feedback;

और इसके बाद ऑब्जेक्ट का प्रिंटआउट लौट आए।

Illuminate\Database\Eloquent\Collection Object
(    [items:protected] => Array
       (
           [0] => Feedback Object
               (
                   [table:protected] => feedback
                   [connection:protected] => 
                   [primaryKey:protected] => id
                   [perPage:protected] => 15
                   [incrementing] => 1
                   [timestamps] => 1
                   [attributes:protected] => Array
                       (
                           [id] => 1
                           [rma_id] => 3
                           [item_id] => 8
                           [quo_id] => 0
                           [case_id] => i2eM20160120
                           [line_no] => 000001
                           [content] => test
                           [status] => sent
                           [read] => 0
                           [sender] => Tester
                           [created_at] => 2016-01-20 18:03:44
                           [updated_at] => 2016-01-20 18:03:44
                       )

                   [original:protected] => Array
                       (
                           [id] => 1
                           [rma_id] => 3
                           [item_id] => 8
                           [quo_id] => 0
                           [case_id] => i2eM20160120
                           [line_no] => 000001
                           [content] => test
                           [status] => sent
                           [read] => 0
                           [sender] => Tester
                           [created_at] => 2016-01-20 18:03:44
                           [updated_at] => 2016-01-20 18:03:44
                       )

                   [relations:protected] => Array
                       (
                       )

                   [hidden:protected] => Array
                       (
                       )

                   [visible:protected] => Array
                       (
                       )

                   [appends:protected] => Array
                       (
                       )

                   [fillable:protected] => Array
                       (
                       )

                   [guarded:protected] => Array
                       (
                           [0] => *
                       )

                   [dates:protected] => Array
                       (
                       )

                   [touches:protected] => Array
                       (
                       )

                   [observables:protected] => Array
                       (
                       )

                   [with:protected] => Array
                       (
                       )

                   [morphClass:protected] => 
                   [exists] => 1
               )

       )

)

यह ठीक काम करता है, और यह दर्शाता है कि आईडी 1 के साथ आइटम पर केवल एक फीडबैक है।

मुझे क्या चिंता है कि डेटासेट को [attributes:protected] और [original:protected] में डुप्लिकेट किया गया है यह सिर्फ एक परीक्षण मामला है और वास्तविक मामले में हजारों फीडबैक शामिल होंगे और एक डुप्लिकेट डाटासेट होने पर स्मृति का एक बड़ा अपशिष्ट होता है। अगर मैं DB::table('table_name') दृष्टिकोण का उपयोग कर रहा हूं तो डेटासेट दोहराया नहीं गया है, लेकिन यह बहुत कम सुविधाजनक है

लार्लेज को मॉडल में डेटा को डुप्लिकेट करने की आवश्यकता क्यों है?

और क्या यह डेटा का केवल एक सेट वापस करने का एक तरीका है?

वर्तमान में मैं क्वेरी के तुरंत बाद अनावश्यक डेटा को ट्रिम करने के लिए ->toArray() का उपयोग कर रहा हूं, लेकिन मेरिएम का उपयोग अभी भी वहां है क्योंकि लारवेल अभी भी उस डेटा सेट का निर्माण कर रहा है।


यह कैसे आंतरिक तरीके से PHP काम करता है इस पर विचार करने के लिए एक मुद्दा नहीं होना चाहिए। जब तक 'एट्रिब्यूट्स' संशोधित नहीं किए जाते हैं, 'एट्रिब्यूट्स' सिर्फ 'मूल' (या दूसरी तरफ) के लिए एक संकेतक है, इसलिए दोनों सरणियों में उनमें से सिर्फ एक होने के कारण लगभग समान स्मृति होती है। यही कारण है कि जब आप toArray() करते हैं तो मेमोरी उपयोग नहीं होता है

विवरण के लिए कृपया इस लिंक को देखें: http://blog.ircmaxell.com/2014/12/what-about-garbage.html


हालांकि यह एक अच्छा उदाहरण प्राप्त करना कठिन है, इससे आपको निश्चित रूप से उन्हें सहेजने से पहले विशेषताओं को सेट करने की सुविधा मिलती है। शायद बहुत अच्छा अगर आप कई फ़ंक्शन के माध्यम से जाते हैं और अंत में जांचते हैं कि अंतिम परिवर्तन के लिए सब कुछ सही ढंग से सेट किया गया है, बिना अलग पहलुओं में सब कुछ स्टोर करने की आवश्यकता के मुकाबले।

बहुत छोटा उदाहरण:

$user = User::find(1);
print_r($user);
$user->name = 'John Doe';
print_r($user);
$user->save();
print_r($user());

जैसे कुछ देता है:

पहला प्रिंट:

[attributes:protected] => Array
(
   [id] => 1
   [name] => 'Jimmy Doe'
   ...
)
[original:protected] => Array
(
   [id] => 1
   [name] => 'Jimmy Doe'
   ...
)

दूसरा प्रिंट:

[attributes:protected] => Array
(
   [id] => 1
   [name] => 'John Doe'
   ...
)
[original:protected] => Array
(
   [id] => 1
   [name] => 'Jimmy Doe'
   ...
)

गहरा प्रिंट:

[attributes:protected] => Array
(
   [id] => 1
   [name] => 'John Doe'
   ...
)
[original:protected] => Array
(
   [id] => 1
   [name] => 'John Doe'
   ...
)

केवल सहेजने के बाद ही डेटा को वास्तव में डीबी में सहेजा जा रहा है।

सुवक्ता के सिंकऑनरिअल () को निकाल दिया जाता है जब कोई मॉडल सहेजता है () 'd:

/**
 * Sync the original attributes with the current.
 *
 * @return $this
 */
public function syncOriginal()
{
    $this->original = $this->attributes;

    return $this;
}

foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator('.')) as $filename)
{
    // filter out "." and ".."
    if ($filename->isDir()) continue;

    echo "$filename\n";
}


PHP दस्तावेज:





php laravel object model query-builder