whereIn laravel funkcja date

0

Mam taki problem

Mam tablice z datami i teraz chodzi o to, żeby wybrać rekordy, które mają określone daty, ale data jest w formacie datetime, więc zastosowałem funkcje DATE_FORMAT w where.
I teraz, żeby było prościej to zastosowałem funkcje w larawerze whereIn.

Robię to w taki sposób.

$date = ['2015-05-05','2016-06-06',....];
       $this->question =  AppMood::query();
        //$this->question->selectRaw("TIMESTAMPDIFF (SECOND, date_start , date_end) as longMood");
        $this->question->selectRaw("(round(sum(TIMESTAMPDIFF (SECOND, moods.date_start , moods.date_end)  * moods.level_mood) / "
                   . "sum(TIMESTAMPDIFF(second,moods.date_start,moods.date_end)),2)) as nas");
            $this->question->selectRaw("round(sum(TIMESTAMPDIFF (SECOND, date_start , date_end)  * level_anxiety) / "
                   . "sum(TIMESTAMPDIFF(second,date_start,date_end)),2) as nas2");
            $this->question->selectRaw("round(sum(TIMESTAMPDIFF (SECOND, date_start , date_end)  *  	level_nervousness ) / "
                  . "sum(TIMESTAMPDIFF(second,date_start,date_end)),2) as nas3");
            $this->question->selectRaw("round(sum(TIMESTAMPDIFF (SECOND, date_start , date_end)  * level_stimulation) / "
                   . "sum(TIMESTAMPDIFF(second,date_start,date_end)),2) as nas4");
              //
        //$this->question->groupBy();
        $this->question->whereIn("DATE_FORMAT(date_end, '%Y-%m-%d')", $date);

I teraz przy wywoływaniu skrypty dostaje

Column not found: 1054 Unknown column 'DATE_FORMAT(date_end

Czytałem, że można pokombinować z whereRaw, ale jak to pogodzić z whereIn ?

3

W whereIn podajesz kolumnę i jako drugi parametr tablicę z wartościami. Odwróć problem - przekonwertuj sobie tą tablicę na właściwy format.

0

@jurek1980:

jurek1980 napisał(a):

W whereIn podajesz kolumnę i jako drugi parametr tablicę z wartościami. Odwróć problem - przekonwertuj sobie tą tablicę na właściwy format.

No ale ja mam właśnie tablicę z wartościami, ale jednocześnie chcę użyć jako pierwszego parametru funkcji, ale chyba tak się nie da.

1

No ale po co?

funcion dateFormatter(array $dates): array
{
    // konwersja daty np. Z użyciem Carbon
    return $dates
}
$result = Model::whereIn('twoja_kolumna',dateFormatter($dates));
0

Ale chodzi o to, żeby kolumnę twoja_kolumna, żeby była w formacie date a jest w formacie datetime czyli muszę usunąć w SQL ten TIME.

0

Nie rozumiem dlaczego tak chcesz ale ok.
Spróbuj czegoś takiego:

$result =Model:query()
->selectRaw("DATE_FORMAT(date_end, '%Y-%m-%d') as formatted_end_date")
->whereIn('formatted_end_date',$dates)
->get();
0

Tak tez próbowałem.
Nie działa jest komunikat

Column not found: 1054 Unknown column 'formatted_end_date' in 'where clause' 
1

Dziwne. Kombinuj.
Jak wyplujesz SQL'a po dodaniu poszczególnych elementów zapytania to jak ono wygląda?

$rawSql = Model::all()
    ->toSql();
dd($rawSql);

Oczywiście wstaw tam swoje zapytanie w całości.
W przykładzie masz alias w tym selectRaw. Może nie dopisuje się ten alias kolumny prawidłowo.

0

Tak to wyglądfa

select DATE_FORMAT(date_end, '%Y-%m-%d') as dateIn, (round(sum(TIMESTAMPDIFF (SECOND, moods.date_start , moods.date_end) * moods.level_mood) / sum(TIMESTAMPDIFF(second,moods.date_start,moods.date_end)),2)) as nas, round(sum(TIMESTAMPDIFF (SECOND, date_start , date_end) * level_anxiety) / sum(TIMESTAMPDIFF(second,date_start,date_end)),2) as nas2, round(sum(TIMESTAMPDIFF (SECOND, date_start , date_end) * level_nervousness ) / sum(TIMESTAMPDIFF(second,date_start,date_end)),2) as nas3, round(sum(TIMESTAMPDIFF (SECOND, date_start , date_end) * level_stimulation) / sum(TIMESTAMPDIFF(second,date_start,date_end)),2) as nas4 from `moods` where `dateIn` in (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) 

Ale ja zawsze w laravelu jak mialem zastosować w klauzuli where funkcji to zawsze musaiłem bezpośrednio w where nigdy w selectRaw tylko wtedy nie stosowałem whereIn

2

Dobra to inaczej, bo tak to faktycznie nie zadziała :)

Model::query()
->whereRaw('DATE_FORMAT(date_end, "%Y-%m-%d") in (?), ["'".implode("','", $dates)."'"])

Musisz tylko sprawdzić mapowanie, czy na pewno dobrze zmapuje parametry. Zawsze możesz użyć 'getBindings()' oprócz 'toSql()'

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