मेरे पास HTTP लिंक की एक सरणी है, मैं सरणी को साफ़ करना चाहता हूं और डेटाबेस पर पहले से मौजूद सभी मानों को हटाना चाहता हूं (एक लेख तालिका पर एक लिंक फ़ील्ड में)।

अभी, मैं सरणी पर पुनरावृत्ति कर रहा हूं, और प्रत्येक मान के लिए, यदि डेटाबेस में मान पहले से मौजूद है तो मैं डेटाबेस से पूछताछ करता हूं।

$links = array("link1", "link2", "link3", "link4");

foreach ($links as $link) {
    $count = Article::where("link", $link)->count();
    if ($count) {
        // link already exists
    }
}

इस दृष्टिकोण का उपयोग करते हुए, एन लिंक की एक सरणी के लिए, मैं अस्तित्व की जांच के लिए डेटाबेस में एक एन क्वेरी करता हूं। क्या कोई तरीका है जिससे मैं इसे और अधिक कुशल और कम खर्चीला बना सकूं?

यह कार्य हर 60 मिनट में किया जाएगा और मेरे लिंक सरणी में कम से कम 10000 लिंक हो सकते हैं।

शुक्रिया!

0
Hamza Mogni 27 जुलाई 2021, 22:24

3 जवाब

सबसे बढ़िया उत्तर

टिम लुईस और रिक जेम्स:

$links = array("link1", "link2", "link3", "link4");

$links_already_there = Article::whereIn("link", $links)->pluck("link")->toArray();

return array_values(array_diff($links, $links_already_there));

0
Hamza Mogni 28 जुलाई 2021, 10:04

आप IN विकल्प का उपयोग करके इसे ऑप्टिमाइज़ कर सकते हैं।

    $links = array("link1", "link2", "link3", "link4");


    $count = Article::whereIn("link", $links)->count();
    if ($count) {
        // link already exists
    }
0
dev_mustafa 27 जुलाई 2021, 19:28

यह एकल क्वेरी col के मान लौटाएगी जो तालिका t में में हैं (आउटआउट की प्रति पंक्ति एक:

SELECT  col
    FROM t
    WHERE col IN (array-of-possible-values)

यह एक एकल स्ट्रिंग देता है - पाए गए मानों का एक अल्पविराम:

SELECT  GROUP_CONCAT(col)
    FROM t
    WHERE col IN (array-of-possible-values)

परिणामसेट को [किसी तरह] क्लाइंट 'सरणी' में डालने की आवश्यकता है। आपने कहा था कि आप उसके बाद "diff" करने को तैयार हैं?

0
Rick James 27 जुलाई 2021, 21:51