2015-02-18 16 views
5

Załóżmy, że mam tabelę A z jej aktywnym rekordem w yii2, Jaki jest najlepszy sposób, aby załadować rekord z maksymalną utworzoną datą do modelu.Yii2 wybrać według daty maksymalnej?

Jest to zapytanie:

 select * 
    from A 
    where created_date = (
     select max(created_date) from A 
    ) 

Teraz jestem coraz datę max pierwszy następnie używać go w innym dostępu do IE bazy:

$max = A::find()->select("created_date)")->max(); 
    $model = A::find()->where("created_date = :date",[":date"=>$max])->one(); 

Jestem pewien, że można to zrobić z jeden dostęp do bazy danych, ale nie wiem jak.

proszę o pomoc.

Odpowiedz

13

Zapytanie jest odpowiednikiem:

SELECT * FROM A ORDER BY created_date DESC LIMIT 1; 

można zamówić rekordy przez created_date w kolejności malejącej i uzyskać pierwszego rekordu tj

$model = A::find()->orderBy('created_date DESC')->one(); 
+1

Powinno Używam również limitu ...-> (1)? To dziwne, ale z ograniczeniem działa szybciej dla mnie. Mam 2 miliony wierszy w moim DB – Footniko

+0

@Footniko Według oficjalnej dokumentacji: Ani yii \ db \ ActiveRecord :: findOne() ani yii \ db \ ActiveQuery :: one() doda LIMIT 1 do wygenerowanej instrukcji SQL. Jeśli zapytanie może zwrócić wiele wierszy danych, należy wyraźnie wywołać limit (1), aby poprawić wydajność, np. Customer :: find() -> limit (1) -> jeden(). http://www.yiiframework.com/doc-2.0/guide-db-active-record.html – nicolascolman

2

Spróbuj

$model = A::find()->orderBy("created_date DESC")->one(); 
1
$maxdate=A::find()->max('created_date'); 
+0

Dodaj wyjaśnienie w odpowiedzi na pytanie, w jaki sposób ta odpowiedź pomaga OP w naprawianiu bieżącego problemu –

Powiązane problemy