Laravel wykonywanie operacji select w select

0

Mam takie pytanie czy można jakoś za pomocą modelu wykonać select i w selecie jeszcze jeden select mam coś takiego.

        $array = $Mood->select( DB::raw(" select date_start from sleeps where date_start >= '$this->dateStart' and date_end <= '$this->dateTo' and id_users = '$idUser'" ))
                ->where("date_start",">=",$this->dateStart)
                ->where("date_end","<=",$this->dateTo)
                ->where("id_users",$idUser)
                ->groupBy(DB::Raw("(DATE(IF(HOUR(date_end) >= '$hour', date_start,Date_add(date_end, INTERVAL - 0 DAY) )) ) "))
                ->get();

Bo to zwraca błąd

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'select date_start from sleeps where date_start >= '2021-04-01' and date_end <= '' at line 1 (SQL: select select date_start from sleeps where date_start >= '2021-04-01' and date_end <= '2021-05-15' and id_users = '38' from `moods` where `date_start` >= 2021-04-01 and `date_end` <= 2021-05-15 and `id_users` = 38 group by (DATE(IF(HOUR(date_end) >= '5', date_start,Date_add(date_end, INTERVAL - 0 DAY) )) )) 

I czy to jest dobrze jak na model czy lepiej użyć czegoś takiego

DB::select("select ...")

Bo chcę osiągnąć taki efekt, że mam na końcu dnia nastroj i jest record który ma początek nastroju i koniec nastroju i tych nastroi jest w ciągu dnia n, i jest jeszcze tabela sen i ta tabela ma począttek snu i koniec snu i tam najczęściej w ciągu dnia jest 1 sen i teraz chodzi mi, że skontruować zapytanie, które obliczy różnice minut w najpóźniejszym nastroju dnia i początkiem snu czyli jak mamy nastrój 21:00-22:00 i potem sen 23:30-8:50 to, żeby odjął 23:30 i 22:00 i teraz jak to zrobić najprościej mysql bo te tabele nie są powiązane myślałem, żeby zrobić select i drugi select w tym samym zapytaniu, więc jak to najprościej zrobić ?

3

Ponieważ tradycyjnie napisałeś ścianę niezrozumiałego tekstu bez znaków przystankowych, nie podejmuję się pomocy w stworzeniu zapytania.
Natomiast żeby pomóc sugeruje zamiast get() użyć metod toSql() i getBindings().
Czyli:

 $sql = $Mood->select( DB::raw(" select date_start from sleeps where date_start >= '$this->dateStart' and date_end <= '$this->dateTo' and id_users = '$idUser'" ))
                ->where("date_start",">=",$this->dateStart)
                ->where("date_end","<=",$this->dateTo)
                ->where("id_users",$idUser)
                ->groupBy(DB::Raw("(DATE(IF(HOUR(date_end) >= '$hour', date_start,Date_add(date_end, INTERVAL - 0 DAY) )) ) "))
->toSql();
dd ($sql);

Po tym jak zobaczysz co jest źle, będzie łatwiej Ci to poprawić.

0

Chodzi o to, że jest tabela Mood i w niej są nastroje i tabela Sleep gdzie są sny i teraz mi chodzi o to co trzeba zrobić, żeby obliczyć jaka jest różnica między ostatnim nastrojem w ciągu dnia, a początkiem snu w tym dniu ?
Wiem jak to zrobić tylko mi chodzi, żeby to zrobić za pomocą jedno zapytania czyli dwóch selectów w jednym zapytaniu można tak ?

0

Pokaż strukturę tych dwóch tabel, bo tak to trudno zrozumieć, o co Ci dokładnie chodzi.

0

Tabela 1
name = moods
Pola
id, autoincrement,
date_start, datetime
date_end, datetime
id_users, int

Tabela 2
name sleps
pola id autoincrement
date_start , datetime
date_end, datetime
id_users, int

I teraz chodzi o zapytanie, które zwróci różnicę minut w rekordzie, który ma najpóźniejsza godzinę w tabeli moods, a najwczesniejszym w tabeli sleeps.

Czyli jak mamy

w tabeli moods
date_start date_en
2015-12-12 2200 2015-12-13 0000
2015-12-12 1200 2015-12-12 1300
2015-12-16 2000 2015-12-16 2200

tabela sleeeps
date_start
2015-12-13 0100 - 2015-12-14 1000
2015-12-16 2300 - 2015-12-17 0900

I teraz chodzi o to, żeby w końcowym wyniku było coś takiego.

data czas
2015-12-13 0100
2015-12-17 0000

1 użytkowników online, w tym zalogowanych: 0, gości: 1