Laravel tylko z nazwy, bo kontynuujemy lekcję poprzednią, ale musimy jeszcze nieco powiedzieć sobie o bazach danych. Pracujemy na testowej z poprzedniego rozdziału. Do dzieła.
Ok, ostatnio zrobiliśmy sobie taki left join:
SELECT * FROM `people` AS p
LEFT JOIN `contacts` AS c
ON p.id = c.person_id;
I wiemy co to left join, pan Tim Homeless choć adresu nie posiada też się pokazuje. Jego wartości zaś to null.
Uporządkujmy tabelę, po pierwsze join za dużo nam kolumn zaciąga:
SELECT p.*,
a.city,
a.street
FROM `people` AS p
LEFT JOIN `addresses` AS a
ON p.id = a.person_id;
Teraz tylko ulicę i miasto bierzemy. Nadal jednak jest problem, że nulle się pokazują. I mają się pokazywać, to left join, ale może w ładniejszej formie:
SELECT p.*,
COALESCE(a.city, 'N/A'),
COALESCE(a.street, 'N/A')
FROM `people` AS p
LEFT JOIN `addresses` AS a
ON p.id = a.person_id;
Teraz tam gdzie null mamy N/A. Ładnie, za to tragiczna nazwa kolumny, poprawmy to:
SELECT p.*,
COALESCE(a.city, 'N/A') as city,
COALESCE(a.street, 'N/A') as street
FROM `people` AS p
LEFT JOIN `addresses` AS a
ON p.id = a.person_id;
Ok, powinniśmy już powoli ogarniać ten SQL. Zobaczmy teraz na tabelkę addresses.
Pierwszy numer id to tam 2, nie jeden. Jest tak, ponieważ za pierwszym razem zaliczyliśmy foreign key constraint error:
INSERT INTO `addresses`
(person_id, city, street)
VALUES
(10, "London", "London Street");
#fail
Btw. wy to sobie wszystko czytacie, a ja to ponotowane mieć muszę i pamiętać co było 2 lekcje temu, co 200 lekcji temu a co 500. Ok, nieważne, sprawa jest taka, że auto increment się nam popsuł.
No może nie popsuł, ale fajnie by było go ustawić znowu na 1.
Najpierw usuńmy wszystko z addresses:
DELETE FROM `addresses` WHERE 1;
Btw. where 1 to takie while true, tego nie trzeba pisać (ale przyda się do SQL injection, ale to jeszcze trochę). Teraz dodajmy nowy adres i…
INSERT INTO `addresses`
(person_id, city, street)
VALUES
(3, "Warsaw", "Warsaw Street");
I id (id adresu, nie person_id) mamy 5. W ogóle się nie zresetowało. Ok, usuwamy raz jeszcze:
DELETE FROM `addresses`;
PhpMyAdmin nas pyta, czy chcemy to zrobić. Mógłby też pytać gdy robimy update query bez where moim zdaniem, ale ok.
Teraz pora na restart auto_incrementa:
ALTER TABLE `addresses` AUTO_INCREMENT = 1;
Ok, teraz jak coś dodamy to będzie id zaczynał się od 1.
Mamy też komendę:
TRUNCATE TABLE `addresses`
Usuwa dane z tabeli, ale nie samą tabelę plus restartuje auto-increment.