2012-11-20 2 views
0

Je suis donc un peu bloqué sur ce qui précède et je continue d'obtenir une erreur SQL Server. Oui, j'utilise le serveur mssql: | - Pas ma base de données.CAKEPHP - Erreur MSSQL lors du filtrage des enregistrements par association distante

Un peu d'histoire, mes relations regard inquiet comme ceci:

AssetMaintenanceRecord -> (appartient à) -> Actif -> (appartient à) -> Projet -> (a un) -> ProjectManager

(note ProjectManager est comme un modèle d'alias pour une table de personnel.) La table de projet a un ID pour ProjectManager qui est juste l'ID de personnel

Donc j'essaye de faire un filtre simple en sélectionnant tous les AssetMaintenanceRecords par une recherche sur ProjectManager

La fonction d'index lié à AssetMaintenanceRecordsController.php ressemble à:

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)); 
    } 

Sans le filtre ProjectManager il fonctionne très bien et je peux écho le tableau ProjectManager etc., mais quand je rentre dans un terme de recherche je reçois cette erreur:

The multi-part identifier "ProjectManager.PerSurname" could not be bound.

La sql exécutée ressemble:.

« SELECT TOP 10 [AssetMaintenanceRecord] [MtceRegID] AS [AssetMaintenanceRecord_ 0], [AssetMaintenanceRecord] [AssetID] AS [AssetMaintena. nceRecord _1], CAST (CAST ([AssetMaintenanceRecord]. [MtceRegNote] AS VARCHAR (8000)) COMME TEXTE) AS [AssetMaintenanceRecord_ 2], [AssetMaintenanceRecord]. [POno] AS [AssetMaintenanceRecord _3], CAST (CAST ([AssetMaintenanceRecord]. [NotifiedDate] AS VARCHAR (8000)) COMME TEXTE) AS [AssetMaintenanceRecord_ 4], CAST (CAST ([AssetMaintenanceRecord]. [CompletedDate] AS VARCHAR (8000)) COMME TEXT) AS [AssetMaintenanceRecord _5], [AssetMaintenanceRecord]. [MtceRegTitle] AS [AssetMaintenanceRecord_ 6], CAST (CAST ([AssetMaintenanceRecord]. [Date de création] AS VARCHAR (8000)) AS TEXT) AS [AssetMaintenanceRecord _7], [AssetMaintenanceRecord]. [CreatedUserID] AS [ AssetMaintenanceRecord_ 8], CAST (CAST ([AssetMaintenanceRecord]. [Date de modification] AS VARCHAR (8000)) AS TEXT) AS [AssetMaintenanceRecord _9], [AssetMaintenanceRecord]. [ModifiedUserID] AS [AssetMaintenanceRecord_ 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)) COMME TEXTE) AS [Asset_ 20], [Asset]. [aActif] 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)) COMME TEXTE) AS [Asset_ 30], CAST (CAST ([Asset]. [APOCostExGst] COMME VARCHAR (8000)) AS TEXT) AS [Asset _31], [Asset]. [AQtyStock] AS [ Asset_ 32], [Atout].[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)) COMME TEXTE) AS [Asset _37], [Asset]. [AWO] AS [Asset_ 38], CAST (CAST ([Asset]) . [aWODate] AS VARCHAR (8000)) COMME TEXTE) AS [Asset _39], [Asset]. [aSold] AS [Asset_ 40], CAST (CAST ([Asset]. [aSoldDate] AS VARCHAR (8000)) COMME TEXTE) AS [Asset _41], CAST (CAST ([Asset]. [ASoldPrice] AS VARCHAR (8000)) COMME TEXTE) AS [Asset_ 42], CAST (CAST ([Asset]. [ANotes] AS VARCHAR (8000)) COMME TEXTE) AS [Asset _43], CAST (CAST ([Asset]. [LastModDate] AS VARCHAR (8000)) AS TEXT) AS [Asset_ 44], CAST (CAST ([Asset]. [CreatedDate] AS VARCHAR (8000)) COMME TEXTE) 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] AS [Asset _51], CAST (CAST ([Asset]. [aLastFuelDate] AS VARCHAR (8000)) COMME TEXTE) AS [Asset_ 52], [Asset]. [aFuelType] AS [Asset _53] FROM [tbMtceRegister] AS [AssetMaintenanceRecord] LEFT JOIN [tbAsset] AS [Asset] ON ([AssetMaintenanceRecord]. [AssetID] = [Asset]. [aID]) WHERE [CompletedDate] EST NULL ET [Asset]. [aCurrProject] IS NULL AND (([ProjectManager]. [PerGivenName] COMME '% test%') OU ([ProjectManager]. [PerSurname] COMME '% test%')) ORDER BY [Co mpletedDate] ASC '

Cela me semble correct mais je vais évidemment mal quelque part?

Toute aide appréciée.

Merci d'avance.

Répondre

0

ProjectManager ne figure pas dans FROM ou JOIN partie mais utilisé dans WHERE: OR ([ProjectManager].[PerSurname] LIKE

+0

Oh oui, je vois que ... alors comment pourrais-je aller à se joindre à la ProjectManager/projet à la requête? (sql n'est définitivement pas mon fort). – double07

+0

Je ne connais pas vos noms dans SQL quelque chose comme joindre ProjectManager sur ProjectManager.ID = Project.ProjectManager_ID jointure gauche s'il est possible qu'aucun gestionnaire est attribué – bummi

+0

Ok donc j'ai essayé de faire les jointures comme ceci: '$ this-> paginera [ 'AssetMaintenanceRecord'] = array ( \t \t 'contiennent' => array ( \t \t \t 'actifs' => array ( \t \t \t \t 'projet' => array ( \t \t \t \t \t 'ProjectManager' \t \t \t)) \t \t \t), \t \t 'commander' => 'CompletedDate ASC', \t 'limite' => 10, \t \t 'rejoint' => array ( \t \t tableau \t ('table' => « tbPersonnel ' \t \t \t \t 'alias'=> 'ProjectManager', \t \t \t \t 'type'=> 'gauche', \t \t \t \t' conditi ons' => array ( \t \t \t \t \t 'ProjectManager.perID = Project.pjProjectManager', \t \t \t \t) \t \t \t) \t \t) \t \t); ' – double07

Questions connexes