簡體   English   中英

CakePHP 2.0在查詢中命名MySQL聚合函數

[英]CakePHP 2.0 naming MySQL aggregate functions in query

我在本機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
                )

        )

)

抱歉這么快回答...希望對其他有相同問題的人有所幫助。 這是解決方案。 基本上,您必須為模型設置空的虛擬字段,然后使用MyModel__VirtualFieldName作為列的別名。 之后就完美了!

附帶說明一下 ,Twitter上的@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
");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM