6

Ich versuche eine Datenbankansicht über eine Migration in Laravel 5.2 zu erstellen, da ich eine ziemlich komplexe Abfrage an eine Ansicht übergeben muss. Ich habe Modelle/Tabellen für Ligen, Teams, Spieler und Punkte. Jeder hat eine hasMany/belongsTo-Beziehung mit der davor. Das Ziel besteht darin, eine Tabelle zu erstellen, in der jede Zeile ein Liganame, eine Summe aller verbleibenden Punkte für die Liga und eine Anzahl von points.remnants ist, wobei der Wert von points.remnants> 4 ist.Datenbankansicht im Migration Laravel erstellen 5.2

Major Edit:

Was ich bisher habe, ist

  DB::statement('CREATE VIEW wones AS 
     SELECT 
      leagues.name as name, 
      sum(points.remnants) as trem, 
      count(case when points.remnants < 4 then 1 end) as crem 
    FROM leauges 
     JOIN teams ON (teams.league_id = leagues.id) 
     JOIN players ON (players.team_id = teams.id) 
     JOIN points ON (points.player_id = players.id); 
    '); 

Dies keine Fehler werfen, aber es gibt nur eine Zeile und die Summe für alle Punkte in allen Ligen.

Ich suche nach einer Tabelle, wo es eine Reihe für jede Liga gibt, die den Liganamen, die restlichen Punkte für diese Liga und die Gesamtpunkte mit weniger als 4 übrig hat.

Als gelöst markiert. Siehe die akzeptierte Antwort für die meisten dieser Probleme. Das Problem mit einer Zeile bestand darin, dass ich GROUP BY nicht mit count() verwendete.

+0

DB :: statement() wird Ihre Abfrage so ausführen wie sie ist, also würde ich annehmen, dass das Problem nichts mit Laravel zu tun hat. Haben Sie versucht, diese Abfrage direkt auf dem Client auszuführen? –

+0

Ah. Ich könnte es dann überdenken. Wenn ich es in sql ausführen würde, wären die Anzahl und die Summe in der Auswahl vor den Joins. Wenn ich das in Laravel versuche, gibt es einen Fehler –

Antwort

3

Es sieht für mich aus wie das Problem ist Ihre SQL-Syntax. Hier ist, was Sie geschrieben haben:

CREATE VIEW wones AS SELECT (name from leagues) AS name 
join teams where (leagues.id = team.country_id) 
join players where (teams.id = players.team_id) 
join points where (players.id = points.player_id) 
sum(points.remnants) AS trem 
count(points.remnants where points.remnants < 4) AS crem 

Das Problem mit der Art und Weise ist, dass Sie FROM und JOIN Klauseln mit Spaltenangaben gemischt haben. Versuchen Sie dies:

CREATE VIEW wones AS 
SELECT 
    leagues.name, 
    sum(points.remnants) AS trem 
    sum(IF(points.remnants<4, 1, 0)) AS crem 
FROM leagues 
    JOIN teams ON (leagues.id = team.country_id) 
    JOIN players ON (teams.id = players.team_id) 
    JOIN points ON (players.id = points.player_id); 

Ich habe es ein wenig umformatiert, um es ein wenig klarer zu machen. Die SQL-Schlüsselwörter werden groß geschrieben und die verschiedenen Klauseln werden auf ihre eigenen Zeilen getrennt. Was wir hier tun, ist die Angabe der Spalten, gefolgt von den Tabellenspezifikationen - zuerst die leagues Tabelle, dann die anderen Tabellen, die mit dieser Tabelle verbunden sind.

+0

Sie haben meistens Recht. Ich weiß, dass ich diesen Versuch, alles in Eloquente übersetzen zu lassen, in meinem Kopf habe und jetzt mache ich dumme Fehler mit der grundlegenden SQL-Syntax. Die Abfrage, wie Sie sie angeordnet haben, sieht viel besser aus, aber es wirft immer noch einen Syntaxfehler beim count(). –

+0

Ich glaube nicht, dass das auch richtig ist, da es die WHERE-Klausel sowohl auf count() als auch auf sum() anwenden würde, und ich möchte nur, dass es auf count() angewendet wird. –

+0

Ok, noch eine Bearbeitung - Ich gehe davon aus, dass Sie die Summe von 'points.remnants' für alle Zeilen in der Tabelle plus die Anzahl der Zeilen, wo' points.remnants' <4. Die 'Summe' addiert 1, wenn der Wert kleiner als 4 ist, oder Null, sonst – Kryten