मेरे पास यह कोड है और अनुकूलन करना चाहते हैं जहां स्थिति उदाहरण में लिखती है। मैं यह कैसे कर सकता हूँ:

इसे किसी अन्य विधि से कैसे लिखें, ताकि परिणाम समान रहे:

->where(
    "(b.updated_at is null 
        OR u.updated_at > b.updated_at 
        OR i.updated_at > b.updated_at
    ) AND (
        u.last_name <> ''
        OR u.first_name <> ''
    ) AND (
        u.updated_at > :seconds 
        OR i.updated_at > :seconds
    )",
    ['seconds' => $seconds]
)
0
Evgeniy Chorniy 13 सितंबर 2018, 16:10

2 जवाब

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

आप इसे सरणी सिंटैक्स में विभाजित कर सकते हैं:

->where(
    [
        'AND',
        [
            'OR',
            'b.updated_at is null',
            'u.updated_at > b.updated_at',
            'i.updated_at > b.updated_at',
        ],
        [
            'OR',
            "u.last_name <> ''",
            "u.first_name <> ''",
        ],
        [
            'OR',
            'u.updated_at > :seconds',
            'i.updated_at > :seconds',
        ],
    ],
    ['seconds' => $seconds]
)

लेकिन यह इसे और अधिक कुशल और न ही अधिक पठनीय बना देगा। तो जब तक आप इस शर्त पर कुछ और प्रसंस्करण नहीं करना चाहते हैं (इसे स्ट्रिंग की तुलना में सरणी पर करना आसान होना चाहिए), इस स्थिति को स्ट्रिंग के रूप में छोड़ना बेहतर हो सकता है।

0
rob006 13 सितंबर 2018, 16:32

सुनिश्चित नहीं है कि आप यहां 'ऑप्टिमाइज़' क्या कहते हैं, लेकिन आप कॉल को चेन करने का भी प्रयास कर सकते हैं।

आईएमएचओ, यह क्वेरी को और अधिक पठनीय बनाता है - भले ही यह अंत में एक ही जेनरेट किया गया एसक्यूएल हो:

        ->where("b.updated_at is null OR u.updated_at > b.updated_at OR i.updated_at > b.updated_at")
        ->andWhere("u.last_name <> '' OR u.first_name <> ''")
        ->andWhere("u.updated_at > :seconds OR i.updated_at > :seconds", ['seconds' => $seconds])->all();
0
ChristopheBrun 15 सितंबर 2018, 14:09