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.