CakePHP 2.0 именует агрегатные функции MySQL в запросе - PullRequest
0 голосов
/ 05 ноября 2011

У меня есть сложный запрос в моем проекте, который я выполняю в нативном SQL.

$r = $this->User->Project->query("
    SELECT
        Project.id,
        Project.name,
        Customer.name,
        (SELECT SUM(hours)
            FROM entries
            WHERE project_id = Project.id
                AND createdby = $id
                AND deleted = 0
                AND YEAR(entry_date) = YEAR(NOW())
                AND DAYOFYEAR(entry_date) = DAYOFYEAR(NOW())) as TodayHours,
        (SELECT SUM(hours)
            FROM entries
            WHERE project_id = Project.id
                AND createdby = $id
                AND deleted = 0
                AND YEAR(entry_date) = YEAR(NOW())
                AND WEEKOFYEAR(entry_date) = WEEKOFYEAR(NOW())) as WeekHours,
        (SELECT SUM(hours)
            FROM entries
            WHERE project_id = Project.id
                AND deleted = 0) as SpentHours,
        Project.budget_hours as TotalHours
    FROM projects as Project
        INNER JOIN users_projects UserProject on UserProject.project_id = Project.id
            AND UserProject.user_id = $id
        INNER JOIN customers Customer on Customer.id = Project.customer_id
    WHERE Project.deleted = 0
            AND Project.archived = 0
");

Когда результаты возвращаются, почти все выглядит идеально.Единственная проблема в том, что CakePHP выбрасывает мои SUM столбцы в их собственную группу [0].Я хотел бы объединить их с Project, если это возможно.Есть ли способ, которым я могу псевдоним этих полей, чтобы это произошло?

Array
(
    [0] => Array
        (
            [Project] => Array
                (
                    [id] => 7
                    [name] => Some Project Name
                    [TotalHours] => 67.00
                )

            [Customer] => Array
                (
                    [name] => Some Customer Name
                )

            [0] => Array
                (
                    [TodayHours] => 2.25
                    [WeekHours] => 27.25
                    [SpentHours] => 27.25
                )

        )

)

1 Ответ

1 голос
/ 05 ноября 2011

Извините, что так быстро отвечаю ... Надеюсь, это поможет другим людям, у которых такой же вопрос. Вот решение. В основном вам нужно настроить пустые виртуальные поля для вашей модели, а затем создать псевдоним столбцов с помощью MyModel__VirtualFieldName. После этого он идеален!

Заметьте, что @ jose_zap в Твиттере - это разработчик ядра CakePHP и очень, очень полезный. Еще раз спасибо!

//Add the virtual fields for this specific case
$this->User->Project->virtualFields += array(
    'TodayHours' => 0,
    'WeekHours' => 0,
    'SpentHours' => 0
);

//Run the query
$projects = $this->User->Project->query("
    SELECT
        Project.id,
        Project.name,
        Customer.name,
        (SELECT SUM(hours)
            FROM entries
            WHERE project_id = Project.id
                AND createdby = $id
                AND deleted = 0
                AND YEAR(entry_date) = YEAR(NOW())
                AND DAYOFYEAR(entry_date) = DAYOFYEAR(NOW())) as Project__TodayHours,
        (SELECT SUM(hours)
            FROM entries
            WHERE project_id = Project.id
                AND createdby = $id
                AND deleted = 0
                AND YEAR(entry_date) = YEAR(NOW())
                AND WEEKOFYEAR(entry_date) = WEEKOFYEAR(NOW())) as Project__WeekHours,
        (SELECT SUM(hours)
            FROM entries
            WHERE project_id = Project.id
                AND deleted = 0) as Project__SpentHours,
        Project.budget_hours as TotalHours
    FROM projects as Project
        INNER JOIN users_projects UserProject on UserProject.project_id = Project.id
            AND UserProject.user_id = $id
        INNER JOIN customers Customer on Customer.id = Project.customer_id
    WHERE Project.deleted = 0
            AND Project.archived = 0
");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...