【问题标题】:CAKEPHP - MSSQL Error When Filtering Records by Distant AssociationCAKEPHP - 通过远程关联过滤记录时出现 MSSQL 错误
【发布时间】:2012-11-20 22:31:56
【问题描述】:

所以我有点卡在上面,我不断收到一个 sql server 错误。是的,我正在使用 mssql 服务器:| - 不是我的数据库。

一点背景,我的人际关系是这样的:

AssetMaintenanceRecord->(属于)->Asset->(属于)->Project->(有一个)->ProjectManager

(注意 ProjectManager 就像人员表的别名模型。项目表有一个 ProjectManager 的 id,它只是人员 id。

所以我正在尝试做一个简单的过滤器,通过在 ProjectManager 上搜索来选择所有 AssetMaintenanceRecords。

AssetMaintenanceRecordsController.php 中的相关索引函数如下:

public function index() {
        $conditions = NULL;
        if (isset($this->params['url']['report']) && $this->params['url']['report']  == 'open') {
            $conditions[] = array('CompletedDate' => NULL);
        }

        if (isset($this->params['url']['report']) && $this->params['url']['report'] == 'notified') {
            $conditions[] = array('NotifiedDate BETWEEN ? AND ?' => array(date('M d Y g:iA', strtotime($this->params['url']['datefrom'])), date('M d Y g:iA', strtotime($this->params['url']['dateto']))));
        }

        if (isset($this->params['url']['report']) && $this->params['url']['report'] == 'completed') {
            $conditions[] = array('CompletedDate BETWEEN ? AND ?' => array(date('M d Y g:iA', strtotime($this->params['url']['datefrom'])), date('M d Y g:iA', strtotime($this->params['url']['dateto']))));
        }

        if (isset($this->params['url']['project'])) {
            $conditions[] = array('Asset.aCurrProject' => $this->params['url']['project']);
        }

        if (isset($this->params['url']['ptCode']) && $this->params['url']['ptCode'] != NULL) {
            $conditions[] = array('Asset.ptCode' => $this->params['url']['ptCode']);
        }

        if (isset($this->params['url']['asset']) && $this->params['url']['asset'] != NULL) {
            $conditions[] = array('Asset.aFullCode' => $this->params['url']['asset']);
        }

        if (isset($this->params['url']['pm']) && $this->params['url']['pm'] != NULL) {
            $pm_search_terms = explode(' ', $this->params['url']['pm']);
            foreach($pm_search_terms as $pm_search_term) {
                $conditions[] = array(
                                'OR' => array(
                                        'ProjectManager.PerGivenName LIKE' =>'%'.$pm_search_term.'%',
                                        'ProjectManager.PerSurname LIKE' =>'%'.$pm_search_term.'%',
                                  )
                          );
            }
        }

        $this->paginate['AssetMaintenanceRecord'] = array(
            'contain' => array(
              'Asset' => array(
                'Project' => array(
                    'ProjectManager'
             ))
            ),
          'order' => 'CompletedDate ASC',
          'limit' => 10
        );

        $planttype = $this->AssetMaintenanceRecord->Asset->PlantType->find('list');
        $this->set(compact('planttype'));
        $this->AssetMaintenanceRecord->recursive = -1;
        $this->set('records', $this->paginate('AssetMaintenanceRecord', $conditions));
    }

如果没有 ProjectManager 过滤器,它可以正常工作,我可以回显 ProjectManager 数组等,但是当我输入搜索词时,我收到此错误:

无法绑定多部分标识符“ProjectManager.PerSurname”。

执行的sql如下:

'SELECT TOP 10 [AssetMaintenanceRecord].[MtceRegID] AS [AssetMaintenanceRecord_0], [AssetMaintenanceRecord].[AssetID] AS [AssetMaintenanceRecord_1], CAST(CAST([AssetMaintenanceRecord].[MtceRegNote ] AS VARCHAR(8000)) AS TEXT) AS [AssetMaintenanceRecord_2], [AssetMaintenanceRecord].[POno] AS [AssetMaintenanceRecord_3], CAST(CAST([AssetMaintenanceRecord].[NotifiedDate] AS VARCHAR( 8000)) AS TEXT) AS [AssetMaintenanceRecord_4], CAST(CAST([AssetMaintenanceRecord].[CompletedDate] AS VARCHAR(8000)) AS TEXT) AS [AssetMaintenanceRecord_5], [AssetMaintenanceRecord].[ MtceRegTitle] AS [AssetMaintenanceRecord_6], CAST(CAST([AssetMaintenanceRecord].[CreatedDate] AS VARCHAR(8000)) AS TEXT) AS [AssetMaintenanceRecord_7], [AssetMaintenanceRecord].[CreatedUserID] AS [ AssetMaintenanceRecord_8], CAST(CAST([AssetMaintenanceRecord].[ModifiedDate] AS VARCHAR(8000)) AS TEXT) AS [AssetMaintenanceRecord_9], [AssetMaintenanceRecord].[ModifiedUserID] AS [AssetMainten anceRecord_10], [Asset].[aID] AS [Asset_11], [Asset].[ptCode] AS [Asset_12], [Asset].[aNo] AS [Asset _13], [Asset].[aFullCode] AS [Asset_14], [Asset].[aDesc] AS [Asset_15], [Asset].[aMake] AS [Asset_ 16], [Asset].[aModel] AS [Asset_17], [Asset].[aSerialNo] AS [Asset_18], [Asset].[aRegNo] AS [Asset_19], CAST(CAST([Asset].[aRegExpDate] AS VARCHAR(8000)) AS TEXT) AS [Asset_20], [Asset].[aActive] AS [Asset_21 ], [Asset].[aIncAssetRpt] AS [Asset_22], [Asset].[aIncFinanceRpt] AS [Asset_23], [Asset].[aIsTrailer] AS [Asset_24] , [Asset].[aIsSurveyEquip] AS [Asset_25], [Asset].[aCostedItem] AS [Asset_26], [Asset].[aCostedPeriod] AS [Asset_27] , [Asset].[aWarrantyPeriod] AS [Asset_28], [Asset].[aPONo] AS [Asset_29], CAST(CAST([Asset].[aPODate] AS VARCHAR(8000) ) AS TEXT) AS [Asset_30], CAST(CAST([Asset].[aPOCostExGst] AS VARCHAR(8000)) AS TEXT) AS [Asset_31], [Asset].[aQtyStock] AS [资产_32], [资产].[aQtyInUse] AS [Asset_33], [Asset].[aCurrProject] AS [Asset_34], [Asset].[aCurrOperator] AS [Asset_35], [Asset ].[aStolen] AS [Asset_36], CAST(CAST([Asset].[aStolenDate] AS VARCHAR(8000)) AS TEXT) AS [Asset_37], [Asset].[aWO ] AS [Asset_38], CAST(CAST([Asset].[aWODate] AS VARCHAR(8000)) AS TEXT) AS [Asset_39], [Asset].[aSold] AS [Asset_ 40], CAST(CAST([Asset].[aSoldDate] AS VARCHAR(8000)) AS TEXT) AS [Asset_41], CAST(CAST([Asset].[aSoldPrice] AS VARCHAR( 8000)) AS TEXT) AS [Asset_42], CAST(CAST([Asset].[aNotes] AS VARCHAR(8000)) AS TEXT) AS [Asset_43], CAST(CAST([ Asset].[LastModDate] AS VARCHAR(8000)) AS TEXT) AS [Asset_44], CAST(CAST([Asset].[CreatedDate] AS VARCHAR(8000)) AS TEXT) AS [Asset_45], [Asset].[aCat] AS [Asset_46], [Asset].[aPoliceRptNo] AS [Asset_47], [Asset].[aRelatedAssetID] AS [Asset_ 48], [Asset].[aRelatedAssetFullCode] AS [Asset_49], [Asset].[aPayMethod] AS [Asset_50], [Asset].[aInvoiceNo] A S [Asset_51],CAST(CAST([Asset].[aLastFuelDate] AS VARCHAR(8000)) AS TEXT) AS [Asset_52],[Asset].[aFuelType] AS [Asset_53] FROM [tbMtceRegister] AS [AssetMaintenanceRecord] LEFT JOIN [tbAsset] AS [Asset] ON ([AssetMaintenanceRecord].[AssetID] = [Asset].[aID]) 其中 [CompletedDate] 为 NULL 并且 [Asset] .[aCurrProject] 为 NULL AND (([ProjectManager].[PerGivenName] LIKE '%test%') OR ([ProjectManager].[PerSurname] LIKE '%test%')) ORDER BY [CompletedDate] ASC'

在我看来还可以,但我显然哪里出错了?

任何帮助表示赞赏。

提前致谢。

【问题讨论】:

    标签: sql-server cakephp relationship


    【解决方案1】:

    ProjectManager 不包含在FROMJOIN 部分中 但用于WHEREOR ([ProjectManager].[PerSurname] LIKE

    【讨论】:

    • 哦,是的,我可以看到...那么我将如何将 ProjectManager/Project 加入查询? (sql 绝对不是我的强项)。
    • 我不知道你在 SQL 中的命名,比如 join ProjectManager on ProjectManager.ID=Project.ProjectManager_ID left join 如果可能没有分配经理
    • 好的,所以我尝试像这样进行连接:$this->paginate['AssetMaintenanceRecord'] = array( 'contain' => array( 'Asset' => array( 'Project' => array( 'ProjectManager' )) ), 'order' => 'CompletedDate ASC', 'limit' => 10, 'joins' => array( array('table' => 'tbPersonnel', 'alias' => 'ProjectManager', 'type' => 'LEFT', 'conditions' => array( 'ProjectManager.perID = Project.pjProjectManager', ) ) ) );
    • 哎呀...继续...我收到错误:无法绑定多部分标识符“Project.pjProjectManager”。尝试加入项目也得到关于 Asset.xxx 的错误无法绑定。尝试加入 Asset 并得到标识符 Asset 已被使用的错误,更改为 Asset2,它返回相同的记录数千次...查询如下:link
    • 这应该有效,只有 where 部分 .... FROM [tbMtceRegister] AS [AssetMaintenanceRecord] JOIN [tbAsset] AS [Asset] ON ([AssetMaintenanceRecord].[AssetID] = [Asset]. [aID]) JOIN [tbProject] AS [Project] ON ([Project].[pjID] = [Asset].[aCurrProject]) LEFT JOIN [tbPersonnel] AS [ProjectManager] ON ([ProjectManager].[perID] = [ Project].[pjProjectManager]) WHERE [CompletedDate] 为空且
    猜你喜欢
    • 1970-01-01
    • 2014-12-03
    • 2012-10-07
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-21
    • 1970-01-01
    相关资源
    最近更新 更多