Pobieranie danych z dwóch tabel powiązanych relacją

Wątek przeniesiony 2022-03-21 14:28 z Webmastering przez cerrato.

0

Cześć.

Mam problem z pobraniem danych z dwóch powiązanych tabel.

Tabele:

CREATE TABLE person (
	id serial4 NOT NULL,
	"name" varchar(255) NOT NULL,
	surname varchar(255) NOT NULL,
	CONSTRAINT person_pkey PRIMARY KEY (id)
);

CREATE TABLE worked_hours (
	id serial4 NOT NULL,
	person_id int4 NOT NULL DEFAULT nextval('person_id_seq'::regclass),
	"month" int4 NOT NULL,
	"year" int4 NOT NULL,
	count int4 NOT NULL,
	CONSTRAINT worked_hours_pkey PRIMARY KEY (id),
	CONSTRAINT fk_92b3b0ad217bbb47 FOREIGN KEY (person_id) REFERENCES public.person(id)
);

W projekcie mam stworzone encje odpowiadające tabelom.

W skrócie: tabele person i worked_hours są powiazane polami: person.id <--> worked_hours.person_id.

Potrzeuję pobrać infomację o liczbie przepracowanych godzin (worked_hours.count) na podstawie osoby i daty (person.id, worked_hours.year, worked_hours.month).

Zwrócone dane powinny być takie same jak te zwrócone przez zapytanie:

select * 
from person p  
left join worked_hours wh on p.id = wh.person_id 
where wh.person_id  = 1
and wh."month" = 1
and wh."year" = 2022;

Jak to najłatwiej zrobić (używając Doctrine)?

Z góry dziękuję za pomoc.

3

Jedna mała uwaga: jeśli używasz LEFT JOIN, to nie dawaj we WHERE warunków na tabelę dołączaną. Bo to jest tak, jakbyś dał "zwykłego" JOINa.

select p.id, sum(wh."count") godzin
from 
  person p  
  left join 
  worked_hours wh 
  on 
    p.id = wh.person_id 
    and wh.person_id  = 1
    and wh."month" = 1
    and wh."year" = 2022
group by p.id
0

@hipekk: W dokumentacji Doctrine sprawdziłeś? np. https://www.doctrine-project.org/projects/doctrine-orm/en/2.8/reference/association-mapping.html#one-to-many-bidirectional

W podanym w dokumentacji przykładzie masz, 1 Product może mieć wiele Feature. W Twoim przypadku masz 1 Person może mieć wiele WorkedHours.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.