在迁移层5.2中创建数据库视图

时间:2016-02-01 20:50:46

标签: laravel laravel-5.2 laravel-migrations laravel-query-builder

我试图通过Laravel 5.2中的迁移创建数据库视图,因为我需要将相当复杂的查询交给视图。我有联盟,球队,球员和积分的模特/桌子。每个人都有一个hasMany / belongsTo关系与之前的关系。我们的目标是创建一个表格,其中每一行都是联盟名称,联盟所有剩余积分的总和,以及积分的数量。其中points.remnants>的值。 4.

主要编辑:

到目前为止我所拥有的是

         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);
     ' );

这不会引发任何错误,但它只会返回一行,而且总和是针对所有联盟中的所有积分。

我正在寻找的是创建一个表格,其中每个联盟都有一排,其中包含联盟名称,该联赛的剩余积分总数以及每个联赛剩余少于4的总积分。

标记为已解决。查看大多数问题的已接受答案。一行问题是因为我没有使用GROUP BY和count()。

1 个答案:

答案 0 :(得分:3)

在我看来问题就是你的SQL语法。这是你写的:

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

问题在于您将FROMJOIN条款与列规范混合的方式。试试这个:

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);

我重新格式化了一下以使其更清晰一些。 SQL关键字是大写的,各个子句分隔在各自的行上。我们在这里做的是指定列,然后是表规范 - 首先是leagues表,然后是其他表连接到那个表。