Temat: Pobranie danych z bazy i wrzucenie do arraya
Kod:
if( $i == $ile_znalezionych){
break;
}
możesz ogóle wyrzucić bo te wartości wewnątrz nigdy nie będą równe z uwagi na
for ($i=0; $i <$ile_znalezionych; $i++)
bo do pętli nie wejdzie w przypadku gdy $i == $ile_znalezionych.
Jeżeli w tabeli "zabiegi" trzymasz informację o umówionych zabiegach to powinieneś trzymać tam czas dodania rekordu, czas początku oraz czas zakończenia zabiegu. Wtedy będziesz mógł wyciągnąć bardzo dużo i nie będziesz musiał zbyt dużo przetwarzać po stronie kodu.
Przykład dla PostgreSQL:
Przykład tabeli
DROP TABLE IF EXISTS zabiegi;
DROP TABLE IF EXISTS zabiegi_nazwy;
CREATE TABLE zabiegi_nazwy(
id INT PRIMARY KEY,
nazwa TEXT,
czas_trwania INTERVAL,
czas_dojazdu INTERVAL
);
CREATE TABLE zabiegi(
id INT PRIMARY KEY,
_od TIMESTAMP,
_do TIMESTAMP,
nazwa_zabiegu INT,
dodano TIMESTAMP DEFAULT NOW(),
CONSTRAINT zabiegi_od_do_uq UNIQUE (_od, _do),
CONSTRAINT zabiegi_nazwa_zabiegu_fkey FOREIGN KEY (nazwa_zabiegu)
REFERENCES zabiegi_nazwy (id) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE RESTRICT
);
INSERT INTO zabiegi_nazwy VALUES (1, 'Zabieg A', '1 hour', '30 minutes');
INSERT INTO zabiegi_nazwy VALUES (2, 'Zabieg B', '30 minutes', '30 minutes');
INSERT INTO zabiegi VALUES (1, '2015-01-05 15:00:00', '2015-01-05 15:00:00'::TIMESTAMP + (SELECT czas_trwania + czas_dojazdu FROM zabiegi_nazwy WHERE id = 2), 2, NOW());
INSERT INTO zabiegi VALUES (2, '2015-01-05 18:00:00', '2015-01-05 18:00:00'::TIMESTAMP + (SELECT czas_trwania + czas_dojazdu FROM zabiegi_nazwy WHERE id = 1), 1, NOW());
INSERT INTO zabiegi VALUES (3, '2015-01-05 20:00:00', '2015-01-05 20:00:00'::TIMESTAMP + (SELECT czas_trwania + czas_dojazdu FROM zabiegi_nazwy WHERE id = 2), 2, NOW());
Idea prosta. Tabela "zabiegi_nazwy" zawiera nazwę, opis zabiegu, czas trwania dla klienta oraz czas trwania przygotowania/dojazdu. Dla klienta kolumna "czas_trwania" dla usługodawcy czas poświęcony na klienta dla zabiegu "czas_trwania + czas_dojazdu". Tabela zabiegi to bardziej kalendarz.
Teraz wyświetlenie terminów wolnych/zajętych dla zadanego okresu czasu dla danego rodzaju zabiegu (różne terminy bo zróżnicowanie długości zabiegu) to:
*wszystkie terminy wolne + zajęte
SELECT DISTINCT ON (r.godziny) r.godziny, z.* FROM (
SELECT generate_series('2015-01-05 09:00:00', '2015-01-05 21:00:00',
(SELECT czas_trwania + czas_dojazdu FROM zabiegi_nazwy WHERE id = 2)) AS godziny
) as r
LEFT JOIN zabiegi z ON r.godziny BETWEEN z._od AND z._do - '1 minute'::INTERVAL
*wszystkie terminy wolne
SELECT DISTINCT ON (r.godziny) r.godziny, z.* FROM (
SELECT generate_series('2015-01-05 09:00:00', '2015-01-05 21:00:00',
(SELECT czas_trwania + czas_dojazdu FROM zabiegi_nazwy WHERE id = 2)) AS godziny
) as r
LEFT JOIN zabiegi z ON r.godziny BETWEEN z._od AND z._do - '1 minute'::INTERVAL
WHERE z.id IS NULL
Sprawdzenie czy dana data i godzina mogą być zarezerwowane dla danego rodzaju zabiegu (true = można zarezerwować, false = już zarezerwowane):
SELECT CASE WHEN x.id IS NULL THEN TRUE ELSE FALSE END AS wolna FROM (
SELECT DISTINCT ON (r.godziny) r.godziny, z.* FROM (
SELECT generate_series('2015-01-05 09:00:00', '2015-01-05 21:00:00',
(SELECT czas_trwania + czas_dojazdu FROM zabiegi_nazwy WHERE id = 2)) AS godziny
) as r
LEFT JOIN zabiegi z ON r.godziny BETWEEN z._od AND z._do - '1 minute'::INTERVAL
WHERE r.godziny = '2015-01-05 14:00:00'
) AS x
Z takich konstrukcji możesz łatwo planować zabiegi trwające 1h w dziurach np po zabiegach dłuższych. Od razu widzisz gdzie masz wystarczająco dużo czasu dla danego zabiegu. Jak odwoła ci się zabieg trwający np 3h to będziesz mógł w to miejsce zaplanować/zarezerwować 2x1,5h lub 3x1h albo 1x1,5h i 1x1h. z 30-min dziurą (np na przerwę dla pracownika :) - w końcu jeść muszą...). Database sam ci powie co i gdzie i nie musisz tego robić iteracyjnie w kodzie.
Z kodu nie wywnioskowałem jaka baza danych więc przykłady zrobione pod taką, w której przypadło mi pracować na co dzień...
A no i jeszcze o podpowiadaniu pierwszego wolnego terminu w danym zakresie zapomniałem
SELECT DISTINCT ON (r.godziny) r.godziny, z.* FROM (
SELECT generate_series('2015-01-05 09:00:00', '2015-01-05 21:00:00',
(SELECT czas_trwania + czas_dojazdu FROM zabiegi_nazwy WHERE id = 2)) AS godziny
) as r
LEFT JOIN zabiegi z ON r.godziny BETWEEN z._od AND z._do - '1 minute'::INTERVAL
ORDER BY r.godziny LIMIT 1
Ten post został edytowany przez Autora dnia 25.10.15 o godzinie 20:10