मैं एक बुकिंग सिस्टम बनाने की कोशिश कर रहा हूं जहां उपयोगकर्ता प्रारंभ तिथि और समय का चयन करता है। सिस्टम सबसे लंबे उत्पाद सेवा समय के आधार पर समाप्ति तिथि और समय बनाता है। फिलहाल यह सब पता चल गया है।

मेरे पास मेरे डेटाबेस में मेरे ईवेंट के लिए एक टेबल है जिसमें है:

vendor_id | user_id | start | end

प्रारंभ और समाप्ति कॉलम डेटटाइम प्रकार के होते हैं।

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

यहाँ मेरा नियंत्रक कोड है:

$items = $query->where('vendor_id', $user->vendor->id)->where('start', '<=', date('Y-m-d H:i:s', strtotime($start)))->whereDate('end', '>=', date('Y-m-d H:i:s', strtotime($end)))->get();

तो कुछ उदाहरण परिदृश्य ...

मेरे पास सिस्टम में एक इवेंट है जिसका प्रारंभ 2019-01-01 13:00:00 है और समाप्ति समय 2019-01 है -01 17:00:00.

अगर मैं 2019-01-01 12:00:00 का प्रारंभ समय और 2019-01-01 16:00:00 का समाप्ति समय चुनता हूं तो यह मेरे चेक को ऊपर से पास कर देता है, लेकिन वह समय स्पष्ट रूप से कई घंटों के लिए ओवरलैप होता है।

मैं वस्तुओं को खींचने के लिए एक समाधान खोजने की कोशिश कर रहा हूं, भले ही वे ओवरलैप हों, न कि केवल अगर उनकी शुरुआत और समाप्ति समय एक निश्चित जांच से मिलते हैं।

किसी भी मदद की सराहना की जाती है।

2
Daniel White 10 पद 2018, 01:08

1 उत्तर

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

आपका प्रश्न पूरी तरह से समझ में नहीं आया है लेकिन फिर भी इसका उत्तर देने का प्रयास करेंगे। दिनांक ओवरलैप के लिए मैं चार परिदृश्य देखता हूं जहां एक ओवरलैप होगा। A को अपने ईवेंट समय अवधि के रूप में और B को खोज परम समय अवधि के रूप में देखें

1)
   A1          A2
B1       B2


2)
   A1          A2
         B1       B2


3)
   A1          A2
B1                B2


4)
   A1          A2
       B1  B2

तुलना के लिए अनुवादित यह होगा

  • 1) बी1 <ए1 और बी2> ए1
  • 2) बी1> ए1 और बी1 <ए2
  • 3) B1 A1
  • 4) बी1> ए1 और बी1 <ए2

1,3 समान हैं और साथ ही 2,4

और लार्वेल में यह पर्याप्त होना चाहिए

$query->where(function ($query) {
    $query->where([
        [$B1, '<', $A1],
        [$B2, '>', $A1],
    ])->orWhere([
        [$B1, '>', $A1],
        [$B1, '<', $A2],
    ]);
});

एक sql स्टेटमेंट के रूप में यह होगा

where (($B1 < $A1 and $B2 > $A1) or ($B1 > $A1 and $B1 < $A2))
9
Jane 12 पद 2018, 00:56