Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zapytanie sql sprawdzające wolny termin
Forum PHP.pl > Forum > Bazy danych > MySQL
ze4lot
Witam,

Przestudiowałem sobie już istniejące tematy na ten temat i albo coś mi nie działało albo dotyczyło odwrotnej sytuacji czyli zwracało wolne pokoje w danym terminie.

Do rzeczy:

Tabela reservations:
obj_id (id obiejktu/pokoju do rezerwacji),
date_from (data od),
date_to (data do)
status (załóżmy, że zawsze 1),

  1. SELECT * FROM `reservations` WHERE
  2. ((`date_from` <= $date_from AND `date_to` >= $date_from) OR
  3. (`date_from` <= $date_to AND `date_to` >= $date_to))
  4. AND `status` = 1 AND `obj_id` = $obj_id


Zapytanie zostało wygenerowane przez kod PHP (eloquent):

  1. protected function checkByStatus($obj_id, $date_from, $date_to, $status) {
  2.  
  3. $query = $this->newQuery();
  4. $query->where(function($query) use ($date_from, $date_to) {
  5. $query->where(function($query) use ($date_from) {
  6. $query->where('date_from', '<=', $date_from)
  7. ->where('date_to', '>=', $date_from);
  8. });
  9. $query->orWhere(function($query) use ($date_to) {
  10. $query->where('date_from', '<=', $date_to)
  11. ->where('date_to', '>=', $date_to);
  12. });
  13. });
  14. $query->where('status', $status);
  15. $query->where('obj_id', $obj_id);
  16. //return dd($query->toSql());
  17. if($query->count() == 0)
  18. return true;
  19. return false;
  20. }


Niestety powyższy kod nie działa prawidłowo i w niektórych przypadkach zwraca wolny termin pomimo, że nie jest wolny.
Bardzo proszę o pomoc w poprawieniu zapytania oraz odpowiedzenie na poniższe pytania:

1. Czy zmienne $date_to i $date_from mogą być zwykłymi stringami (2012-07-03)?
2. Czy właściwie ustawiłem typ kolumn date_from i date_to jako Date?

PS.
Jeżeli jest już na forum rozwiązanie to proszę o linka, mnie osobiście nie udało się znaleźć.

buliq
Kod
SELECT * FROM `reservations` WHERE
((`date_from` <= $date_from AND `date_to` >= $date_from) OR
(`date_from` <= $date_to AND `date_to` >= $date_to))
AND `status` = 1 AND `obj_id` = $obj_id


data od jest mniejsza niż data od z formularza oraz data do jest większa niż data do z formularza
lub
data od jest mniejsza od daty do z formularza i data do jest większa niż data do z formularza

Ja tu widzę błąd logiczny (albo za długo nie mam co robić)
ze4lot
Dzięki za odpowiedź, niestety zapytanie również nie jest poprawne, ponieważ np. przy zarezerwowanym już terminie od 2013.07.03 do 2013.07.06 termin od 2013.07.01 do 2013.07.07 jest uznany za wolny, co jest błędem.

Nie wyjaśniłem tego wcześniej ale np. mając już rezerwacje 2013.07.03 do 2013.07.06, terminy od 2013.07.06 są wolne, bo 07.06 nikt już nie nocuje.
buliq
Masz złe warunki, to źle wybiera

$date_from <= date_to and $date_from >= date_from and $date_to >= date_from and $date_to <= date_to
mmmmmmm
  1. SELECT * FROM `reservations` WHERE
  2. ((`date_from`>= $date_to AND `date_to` <= $date_from)
  3. AND `status` = 1 AND `obj_id` = $obj_id
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.