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

Posted

技术标签:

【中文标题】在迁移 laravel 5.2 中创建数据库视图【英文标题】:Creating database view in migration laravel 5.2 【发布时间】:2016-05-10 11:12:40 【问题描述】:

我正在尝试通过 Laravel 5.2 中的迁移来创建数据库视图,因为我需要将相当复杂的查询交给视图。我有联赛、球队、球员和积分的模型/表格。每一个都与它之前的一个有一个 hasMany / belongsTo 关系。目标是创建一个表格,其中每一行是联赛名称、联赛所有剩余积分的总和以及 points.remnants 的计数,其中 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() 一起使用。

【问题讨论】:

DB::statement() 将按原样执行您的查询,所以我猜这个问题与 laravel 无关。您是否尝试过直接在 cli 上执行此查询? 啊。那我可能想多了。如果我要在 sql 中执行它,计数和总和将在连接之前的选择中。当我在 laravel 中尝试时,它会引发错误 【参考方案1】:

在我看来问题在于您的 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 表,然后是连接到该表的其他表。

【讨论】:

你是对的。我知道我已经让这种将所有内容转换为 Eloquent 的尝试进入了我的脑海,我现在在基本 SQL 语法上犯了愚蠢的错误。您安排的查询看起来好多了,但它仍然在 count() 处引发语法错误。 我认为这也不对,因为它会将 WHERE 子句同时应用于 count() 和 sum(),而我只想将其应用于 count()。 好的,再编辑一次 - 我假设您想要表中所有行的 points.remnants 的总和,加上 points.remnantssum 如果值小于 4,则加 1,否则加 0 我实际上解决了 count() 问题,但我只返回视图表中一个联赛的结果,而不是所有联赛的结果。我将编辑我的问题。

以上是关于在迁移 laravel 5.2 中创建数据库视图的主要内容,如果未能解决你的问题,请参考以下文章

从 db 获取数据到 laravel 5.2 中的视图的问题

在 laravel 5.2 中创建符号链接时出错?

如何在Laravel 5.2中创建QR码?

如何使用 Artisan 命令 (PHP) 在 Laravel 5.2 中创建 RESTful 资源控制器

如何使用一个命令在 laravel 中创建所有三个文件(控制器、模型和数据库迁移文件)

如何从迁移中创建 Laravel 模型?