"Mevcut otel odaları" için arama mantıkları

6 Cevap java

Kullanıcıların "kiralık otel odaları" için arama için bir web sitesi olması demek.

Ben Sizi soruyorum neden olan, mevcut sistemlerin mantığı nasıl bilmiyorum.

Şu anda formda iki alanı vardır:

  Date available from: //example 2010-04-01 // 1st april 2010
  Date available to:   //example 2010-05-01 // 1st may 2010

Sonra Gönder!

Here comes my problem: My search engine is called "Solr" and it searches like this:

 dateFrom:[$date_from TO *] AND dateTo:[* TO $date_to] 
 // $date_from and $date_to = the date inputted by the user in the html form

Yukarıdaki tüm karşılaşmalarda aramak istiyorsunuz where $date_from TO infinite AND infinite TO $date_to.

Bu doğru mudur? Öyle şahsen sanmıyorum ...

Bu nasıl mantık rezervasyon sitelerinde çalışır?

If you need more input let me know! Thanks

GÜNCELLEME:

Btw, kullanıcılar bir "kiralık oda" belirttiğiniz zaman onlar 1 Nisan İÇİN 1 Mart bir dizi örnek belirtin.

Also as an example: Say we have a room which is free between 1st april TO 1st may.

6 Cevap

Tarihleri ​​for bunun yerine serbest zaman daha rezervasyonu yaparken saklamak varsayarsak, sen tarih aralığında her gün için, odanın toplam listesini alarak (o gün ücretsiz oda bir listesini bulmak ve olabilir O gün bir rezervasyon var oda) çıkarılarak. Sonra sadece bu listeyi alıp aralığında her gün ücretsiz oda için aşağı filtre.

Bunu sunan tek bir yol var, ancak verilen mantık, doğru görünüyor.

Sonsuz İÇİN $ date_from! SomeDate.before ($ date_from) eşdeğerdir. Aynı şekilde, date_to ==! SomeDate.after ($ date_to) İÇİN sonsuz $.

Yani, emin inclusively 1 Nisan-1 Mayıs tarihleri ​​arasında hiçbiri, var olmak için her odanın rezervasyonlarda arıyoruz. Bu tarihler arasında rezervasyon varsa, oda mevcut değildir.

Bu örnekte öğretmenler gerçekten uygulamaları programlama ikili (bit) işlemleri uygulamak için öğrenmek gerektiğini öğrencileri ikna etmeye kullanmanız gerekir değil mi?

gibi:

for ($day=$firstday; $day<$lastday; $day++) {
  $testbooking=++$testbooking<<1;
  foreach ($rooms as $id=>$room) {
     $avail[$id]=($avail[$id] + (has_booking($id) ? 0 : 1)) <<1;
  }
 }
 foreach ($avail as $id=>$free_pattern) {
    if ($free_pattern & $testbooking == $testbooking) {
       return $id;
    }
 }
 return false;

Scary - ama onun bazı VTYS optimize denemek ve bunu çözmek bozkır nasıl.

C.

Yukarıdaki mantık hemen hemen doğrudur, ancak hile veritabanı oda saklamak gerektiğini, ancak böyle bir ana tablo oda başına birden çok giriş içerebilir her odada yana bir odada serbest zaman açıklıklı, birden fazla yayılma olabilir

Örnek tablo var sanırım işe başlamak için

 room      start_avail     end_avail
 1         Jan 1           Mar 1
 2         Feb 15          Mar 15

Ve birisi Febuary 2-15 kitaplar oda 1, şimdi hve

 1        Jan 1            Feb 1
 1        Feb 16           Mar 1
 2        Feb 15           Mar 15

Bir istek geldiğinde, temelde veritabanındaki her freetime dilimine karşılaştırmak ve istenen başlangıç ​​tarihinde veya daha önce başlar ve istenen bitiş tarihinde veya daha sonra sona erer bulmak. Bir kez (rezervasyon ne kadar iyi bir uyum bağlı olarak 0, 1 veya 2 olabilir Eğer veritabanından zaman aralığı kaldırmak ve kullanılmayan kalan timespans yerleştirin rezervasyonu.

Eğer kullanıcıya mümkün olan tüm odalara göstermek ve onları seçti izin planlıyorsanız, bitirdiniz. Eğer oda seçilmiş aldığı kontrolünü varsa Ancak, en iyi oda kaynaklarını kullanmak için bir sezgisel dikkate almak gerekir. Örneğin, 'en uygun' sezgisel hep unbooked küçük ekstra kez bırakır oda seçti, böylece 1 gün sarı bir iki hafta yayılma ortasında tek bir gün alarak ve kesme vs 2 günlük ücretsiz aralığını tercih ederim iki freespans içine. Aksi takdirde, Mart ayı 15 Mart ve tek ücretsiz bir oda var olduğunu varsayalım. Bir rezervasyon geldi, bu oda da kullanabilirsiniz. Ama gelecek varsayalım birisi Mart ayı için bir oda arayan siteye geldi. İlk rezervasyon ikinci oda kullanılmış olsaydı, bu isteği fufill mümkün olurdu.

Belki de her gün için ücretsiz oda sayısı ile bir tablo var daha kolaydır.

     DATE | FREE
    ======+=====
    10.03 | 10
    11.03 |  7
    12.03 |  6
    ...

Bir isteği kontrol etmek için sadece bu dönem için asgari ücretsiz oda sayısını seçin ve istenen oda sayısı ile karşılaştırın.

    select min(FREE) from TABLE where DATE >= DATE_FROM and DATE < DATE_TO

(Sorry, I don't know "Solr")
This works since normally there is no need to have a concrete room associated to the reservation.
The rooms will be distributed at check-in.

Rezervasyon / teyit veya iptal oluşturulduğunda tablo güncelleştirilmesi gerekir.

Son zamanlarda benzer bir proje üzerinde çalıştı ve ben bu gerçekten yardımcı olacağını düşünüyorum:

http://www.experts-exchange.com/Web_Development/Web_Languages-Standards/PHP/PHP_Databases/A_2467-Room-Availability-Check-For-Hotel-Motel-Guest-House-Etc.html