2015-05-06 21 views
25

Napisałem poniższe zapytania podczas migracji mojej strony PHP do frameworka Yii2. Chcę je dodać do kontrolera, aby wyświetlić wygrane 10 najlepszych zakładów. Próbowałem przeszukiwać wiele klas bazy danych Yii2, ale nie mogę go uruchomić.Wykonywanie surowych zapytań SQL w Yii2?

Moje tabele są:

użytkownicy:

id | user_name | user_status | ...other columns... 

zakładów:

id | user_id | date_time |...other columns...| balance_return 

Zapytania chcę uzyskać w Yii2 są:

$query_all = $dbh->query(" 
    SELECT SUM(bets.balance_return) AS total_win 
     , bets.user_id 
     , users.user_name 
     , users.user_status 
     FROM bets INNER JOIN users ON bets.user_id = users.id 
    WHERE users.user_status = 'verified' 
     AND bets.date_time > " . $start_date . " 
    GROUP BY bets.user_id 
    ORDER BY total_win DESC 
"); 

Zmienna data_początkowa to okres 6 miesięcy, który obliczam zgodnie z time() Należy również pamiętać, że balance_return to każda wygrana użytkownika, więc jego suma określa ranking.

Drugie zapytanie jest:

$qwi = $dbh->query(" 
    SELECT SUM(bets.balance_return) AS total_win 
     , bets.user_id 
     , users.user_name 
     , users.user_status 
     FROM bets INNER JOIN users ON bets.user_id = users.id 
    WHERE users.user_status = 'verified' 
     AND bets.date_time > " . $start_date . " 
    GROUP BY bets.user_id 
    ORDER BY total_win DESC LIMIT 0,10 
"); 

Odpowiedz

51

można wykonać surowego sql jak ten

$connection = Yii::$app->getDb(); 
$command = $connection->createCommand(" 
    SELECT SUM(bets.balance_return) AS total_win 
    , bets.user_id 
    , users.user_name 
    , users.user_status 
    FROM bets INNER JOIN users ON bets.user_id = users.id 
    WHERE users.user_status = 'verified' 
    AND bets.date_time > :start_date 
    GROUP BY bets.user_id 
    ORDER BY total_win DESC", [':start_date' => '1970-01-01']); 

$result = $command->queryAll(); 

Polecam czytanie: http://www.yiiframework.com/doc-2.0/yii-db-connection.html#createCommand()-detail

Pierwszym parametrem jest sql (z zastępczy (s)), a druga część jest tablicą wartości do użycia z symbolami zastępczymi.

+0

Dziękuję bardzo za odpowiedź na pytanie. Udało mi się zmusić go do pracy po utknięciu na dwa dni. Chciałem też zauważyć, że kiedy nazywam '$ connection = Yii :: $ app-> getDb();' z kontrolera modułu otrzymuję błąd, musiałem zadzwonić '$ connection = \ Yii :: $ app-> getDb(); 'Dlaczego miałoby to być? –

+2

Błąd wynika z przestrzeni nazw. Jeśli chcesz używać 'Yii' bez slasha, musisz dodać' use Yii; 'na górze klasy. – jagsler

+0

Najlepszą praktyką jest nawyk wykonywania '' '\ Yii :: $ app ...' '' wszędzie tam, gdzie używam obiektu Yii w linii. –

Powiązane problemy