2012-07-18 37 views
0

我正在使用symfony 1.4和Doctrine使用遷移將數據上傳到數據庫。Doctrine Migration只從CSV上傳中加載一條記錄

我有一個CSV文件,我試圖批量加載到sfGuardUser表中,並且還將用戶ID與sfGuardUserGroup組ID相匹配,並將其加載到sf_guard_user表中。

當我運行遷移時,它只會從CSV中加載第一條記錄。加載的記錄格式正確(構建用戶名和日期)。

我在將代碼放入遷移之前測試了代碼,並且它正常工作。

我在這裏有語法錯誤,還是沒有設置正確循環?

也許我剛剛把它弄糟了。

PHP

public function up() 
     { 

      $fieldseparator = ","; 
      $lineseparator = "\n"; 
      $csvfile = "web/uploads/batchUpload.csv"; 

      $file = fopen($csvfile,"r"); 
      $size = filesize($csvfile); 

      $csvcontent = fread($file,$size); 

      fclose($file); 

      $lines = 0; 
      $queries = ""; 
      $linearray = array(); 

      foreach(explode($lineseparator,$csvcontent) as $line) { 

       //Clean it up 
       $lines++; 
       $line = trim($line," \t");  
       $line = str_replace("\r","",$line);  
       $line = str_replace("'","\'",$line); 
       $linearray = explode($fieldseparator,$line); 

       //build username 
       if (!$linearray[3]) { 
        $username = $linearray[0]; 
        $username = substr($linearray[0], 0, 1); 
        $username .= $linearray[1]; 
        $username = strtolower($username); 
        $linearray[3] = $username; 
       } 

       //add sha1 algorithm 
       if (!$linearray[4]) { 
        $linearray[4] = "sha1"; 
       } 

       //add is_active 
       if(!$linearray[7]) { 
        $linearray[7] = "1"; 
       } 

       //add current date to login, created and updated 
        $now = getdate();   
        if ($now['mday'] < 10) { 
         $now['mday'] = str_pad($now['mday'], 2, "0", STR_PAD_LEFT); 
        }   
        if ($now['hours'] < 10) { 
        $now['hours'] = str_pad($now['hours'], 2, "0", STR_PAD_LEFT); 
        }  
        if ($now['minutes'] < 10) { 
        $now['minutes'] = str_pad($now['minutes'], 2, "0", STR_PAD_LEFT); 
        }  
        if ($now['seconds'] < 10) { 
        $now['seconds'] = str_pad($now['seconds'], 2, "0", STR_PAD_LEFT); 
        } 
        $linearray[10] = $now['year']. "-" .$now['mon']. 
          "-".$now['mday']." ".$now['hours'].":".$now['minutes'].":" 
          .$now['seconds']; 
        $linearray[11] = $now['year']. "-" .$now['mon']. 
          "-".$now['mday']. " ".$now['hours'].":".$now['minutes']. 
          ":".$now['seconds']; 


      //load up sql 
      $linemysql = implode("','",$linearray);  
      $conn = Doctrine_Manager::getInstance()->connection(); 
      $query = "INSERT INTO sf_guard_user VALUES ('', '$linemysql');"; 

      //$queries .= $query . "\n"; 
      $conn->execute($query); 

      //Add userID to group table 
      $conn = Doctrine_Manager::getInstance()->connection(); 
      $getFirstID = Doctrine::getTable('sfGuardUser')->orderBy('id DESC') 
        ->limit(1)->execute(); 
      $id = $getFirstID['id']; 
      $query = "INSERT INTO sf_guard_user_group ('$id', 5, '$linearray[10]',   '$linearray[11]');"; 
      $conn->execute($query); 
      $query = "INSERT INTO sf_guard_user_group ('$id', 14, '$linearray[10]', '$linearray[11]');"; 
      $conn->execute($query); 
     }// close foreach split 
} 

UPDATE

如果我刪除,我想獲得加載的最後一個ID,並與GuardUserGroup GROUP_ID匹配它的第二個查詢,然後它的作品。所以我想我們可以縮小它,並說我的錯誤是在//Add userID to group table部分

+0

複製/粘貼是正確的?因爲你有一個錯誤,'$ linearray [10] = $ now ['year']之後的行。 「 - 」。$ now ['mon']。(根據高亮代碼) – j0k 2012-07-18 14:51:20

+0

這是一個複製錯誤,而不是實際的代碼。試圖使代碼更清晰一點,而不是一個長字符串。代碼已更新。謝謝 – 2012-07-18 14:59:34

回答

0

已更新我的查詢以獲取最新的id記錄。我認爲主要問題是$ id仍然是查詢中的數組。我打破這樣的:

//Add userID to group table 
$getFirstID = Doctrine::getTable('sfGuardUser')->createQuery()->select('MAX(id) as id')->fetchArray(); 
**$id = $getFirstID[0]; 
$id = $id['id'];** 
$q = "INSERT INTO sf_guard_user_group VALUES ('$id', 5, '$linearray[10]', '$linearray[11]');"; 
$conn->execute($q); 
$query = "INSERT INTO sf_guard_user_group VALUES ('$id', 14, '$linearray[10]', '$linearray[11]');"; 
$conn->execute($query); 
+0

你試過'fetchOne()'而不是? – j0k 2012-07-18 18:16:57

+0

因此,不是$ getFirstID = Doctrine :: getTable('sfGuardUser') - > createQuery() - > select('MAX(id)as id') - > fetchArray(),它會是$ getFirstID = Doctrine :: getTable ('sfGuardUser') - > createQuery() - > select('MAX(id)as id') - > fetchOne(); ??它會不會自動加載到數組中?我會給它一個鏡頭。謝謝 – 2012-07-18 19:06:06

+1

'fetchOne'和'fetchArray'是一樣的,但它只能檢索一個元素作爲數組。所以,這是你想要的。 – j0k 2012-07-18 20:09:12