Создание представления базы данных в миграции laravel 5.2

Я пытаюсь создать представление базы данных с помощью миграции в Laravel 5.2, поскольку мне нужно передать довольно сложный запрос представлению. У меня есть модели / таблицы для лиг, команд, игроков и очков. Каждый из них имеет отношение hasMany / ownTo с предыдущим. Цель состоит в том, чтобы создать таблицу, в которой каждая строка представляет собой название лиги, сумму всех оставшихся очков для лиги и счетчик 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 ().


person Blind Fish    schedule 01.02.2016    source источник
comment
DB :: statement () выполнит ваш запрос как есть, поэтому я предполагаю, что проблема не имеет ничего общего с laravel. Вы пробовали выполнить этот запрос прямо на клиенте?   -  person Daniel Castro    schedule 01.02.2016
comment
Ах. Тогда я, возможно, слишком много об этом думаю. Если бы я должен был выполнить его в sql, счетчик и сумма были бы в выборе перед объединениями. Когда я пытаюсь это сделать в laravel, выдает ошибку   -  person Blind Fish    schedule 01.02.2016


Ответы (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

Проблема в том, как вы смешали предложения FROM и JOIN со спецификациями столбцов. Попробуй это:

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, затем другие таблицы, присоединенные к этой.

person Kryten    schedule 01.02.2016
comment
Вы в основном правы. Я знаю, что позволил этой попытке перевести все на Eloquent в мою голову, и теперь я делаю глупые ошибки с базовым синтаксисом SQL. Запрос в том виде, в котором вы его разместили, выглядит намного лучше, но по-прежнему вызывает синтаксическую ошибку в count (). - person Blind Fish; 02.02.2016
comment
Я тоже не думаю, что это правильно, поскольку он применил бы предложение WHERE как к count (), так и к sum (), и я хочу, чтобы оно применялось только к count (). - person Blind Fish; 02.02.2016
comment
Хорошо, еще одно изменение - я предполагаю, что вам нужна сумма points.remnants для всех строк в таблице плюс количество строк, где points.remnants ‹4. sum добавляет 1, если значение меньше 4, или ноль в противном случае - person Kryten; 02.02.2016
comment
Я действительно решил проблему count (), но я возвращаю результаты только для одной лиги в таблице просмотра, а не для всех лиг. Отредактирую свой вопрос. - person Blind Fish; 02.02.2016