2011-07-14 33 views
0

剛開始使用CakePHP和幾乎幾年後沒有使用的PHP ....CakePHP的相加法(外鍵)

我有一個表的結構是這樣的: 父表.... ..客戶:

<?php 
class Cliente extends AppModel 
{ 
    var $name = 'Cliente'; 
     var $validate = array(
          'nombre' => array('rule'=>'notEmpty') 
          ); 
     var $hasMany = array(
      'Proyecto' => array(
       'className' => 'Proyecto', 
       'foreignKey' => 'cliente_id', 
       'order'  => 'Proyecto.nombre ASC', 
       'dependent' => true     
      ) 
     ); 
} 
?> 

表和子表:Proyects .. 客戶端可以分配多個項目。

<?php 
class Proyecto extends AppModel 
{ 
    var $name = 'Proyecto'; 
     var $validate = array(
          'nombre' => array('rule'=>'notEmpty') 
          ); 
     //var $belongsTo = 'Cliente'; 
     var $belongsTo = array(
      'Cliente' => array(
       'className' => 'Cliente', 
       'foreignKey' => 'cliente_id' 
      ) 
     ); 
} 
?> 

只能從索引客戶端視圖添加(INSERT)項目。所以,我有這個附加(anadir)方法:

function anadir($cliente_id, $nombre) { 
     if (!empty($this->data)) { 
//      echo "El código de cliente 22222: ". $this->data['Proyecto']['id'] . "</br>"; 
//      echo "El código de cliente fk: ". $this->data['Proyecto']['cliente_id'] . "</br>" ; 
//      print_r($this->data); 
         //$this->data['Proyecto']['cliente_id'] = $cliente_id; 
      if ($this->Proyecto->save($this->data)) { 
       $this->Session->setFlash('El proyecto ha sido grabado.'); 
       $this->redirect(array('controller'=>'clientes', 'action'=>'listar')); 
      } 
       } else { 
         //echo "El código de cliente 11111: ". $this->data['Proyecto']['id'];     
        $this->data['Proyecto']['cliente_id'] = $cliente_id; 
       } 
       $this->set('idcliente', $cliente_id); 
       $this->set('nombrecliente', $nombre); 
    } 

我可以在「anadir.ctp」視圖顯示父客戶(和號碼),但它總是更新相同proyect,改變了名稱,僅限描述。沒有ADD/INSERT在表中完成,只有UPDATE。

<!-- File: /app/views/proyectos/anadir.ctp --> 

<h1>A&ntilde;adir proyecto a cliente <?php echo "[$idcliente] - $nombrecliente"; ?></h1> 
<?php 
    //echo $this->Form->create('Proyecto', array('action' => 'anadir')); 
    echo $this->Form->create('Proyecto', array('url' => '/proyectos/anadir/'.$idcliente.'/'.$nombrecliente)); // array('action' => 'anadir')); 
    echo $this->Form->input('cliente_id', array('type' => 'hidden')); 
    echo $this->Form->input('nombre'); 
    echo $this->Form->input('descripcion', array('rows' => '10')); 
    echo $this->Form->end('Grabar proyecto'); 
    echo $this->Html->link('Cancelar', array('controller'=>'clientes', 'action'=>'listar')); 
?> 

肯定這是一個新手問題,但我已經嘗試了幾乎所有的東西。

有什麼想法?

在此先感謝。

====最後====

幾天後,試圖解決這個問題,現在正在運行。但我不明白的問題,我沒有解釋爲什麼我有這個奇怪的問題...

所以我期待symfony2也許更難開始,但我希望更靈活(與多主鍵和外鍵支持,主要)和cakephp明確。

+0

仔細檢查'id'是否存在,並且是'Proyecto'數據庫表(而不是'cliente_id')中的主鍵。可以肯定的是,在if($ this-> Proyecto-> save($ this-> data)){'之前加上'$ this-> Proyecto-> create();'行。 – lxa

+0

數據庫表是好的(我認爲).. id是主鍵。如果我把'$ this-> Proyecto-> create();'你說了什麼,那麼項目就會保存好...與另一個與函數anadir(arg1,arg2)相關的錯誤 - > Ie:'缺少參數1對於ProyectosController :: anadir()[APP/controllers/proyectos_controller.php,第18行]'Hummmmm .... – ferpega

+0

請參閱下面的答案。 – lxa

回答

0

所以它仍然看起來(如deizel建議),你已經在形式得到id集你$this->data莫名其妙,可能是場誤會,不知道(你可以在這裏發表您的看法,所以我們可以採取看)。檢查它的最好方法是監視實際的SQL查詢;把這個$this->Model->save()後(無添加$this->Model->create()然而,用於調試):

$log = $this->Model->getDataSource()->getLog(false, false); 
debug($log); 

加入以上輸出到你的問題。

關於$this->Model->create():在$this->Model->save()之前調用它是完全可以的,甚至是推薦的。這就像變量初始化 - 你可以跳過它,但在你自己承擔風險時,當你確定你在做什麼時。

要解決Missing argument 1 for ProyectosController::anadir()錯誤,您應該在此處發佈您的URL。它應該是像/proyectos/anadir/2/10

+0

我在原始問題上添加了關於debug($ log)的詳細信息。 – ferpega

+0

添加日誌記錄_after_保存(即在'$ this-> Proyecto-> save($ this-> data)')之後 - 目前它不顯示任何'UPDATE' /'INSERT'查詢。但實際上這並不重要,因爲調用'create()'已經解決了你的問題。 – lxa

+0

是的....'create()'修復了它,但我不明白爲什麼我有這個問題。如果我把日誌放在後面,那麼我可以看到它正在更新。 :-( – ferpega

0

CakePHP會如果您的數據中存在的ID在這一點上進行更新:

  if ($this->Proyecto->save($this->data)) { ... 

取消對以下行,並檢查沒有$this->data['Proyecto']['id']值:

//      print_r($this->data); 
+0

'$ this-> data ['Proyecto'] ['id']'爲空。我以前檢查過它(這是'echo'行註釋的原因)。我已取消註釋該行,這是結果:'Array([Proyecto] => Array([cliente_id] => 3 [nombre] => p17 [descripcion] => p17 ... x))' – ferpega

1

以上型號相同

但更改下面的代碼,並嘗試

function anadir() {//add method has not neet parameters 
    if (!empty($this->data)) { 
     //      echo "El código de cliente 22222: ". $this-  >data['Proyecto']['id'] . "</br>"; 
     //      echo "El código de cliente fk: ". $this->data['Proyecto']['cliente_id'] . "</br>" ; 
     //      print_r($this->data); 
        //$this->data['Proyecto']['cliente_id'] = $cliente_id; 
     if ($this->Proyecto->save($this->data)) { 
      $this->Session->setFlash('El proyecto ha sido grabado.'); 
      $this->redirect(array('controller'=>'clientes', 'action'=>'listar')); 
     } 
      } else { 
        //echo "El código de cliente 11111: ". $this->data['Proyecto']['id'];     
       $this->data['Proyecto']['cliente_id'] = $cliente_id; 
      } 
      $this->set('idcliente', $cliente_id); 
      $this->set('nombrecliente', $nombre); 
} 

<!-- File: /app/views/proyectos/anadir.ctp --> 

<h1>A&ntilde;adir proyecto a cliente <?php echo "[$idcliente] - $nombrecliente"; ?></h1> 
<?php 
echo $this->Form->create('Proyecto'); 

echo $this->Form->input('Proyecto.cliente_id', array('type' => 'hidden')); 
echo $this->Form->input('Proyecto.nombre'); 
echo $this->Form->input('Proyecto.descripcion', array('rows' => '10')); 
echo $this->Form->submit('Grabar proyecto',array('url'=> array('controller'=>'proyectos','action'=>'anadir')); 
cho $this->Form->end(); 
echo $this->Html->link('Cancelar', array('controller'=>'clientes', 'action'=>'listar')); 
?> 
+0

我試試這個方法和我有幾個警告:未定義的變量:'未定義的變量:cliente_id [APP/controllers/proyectos_controller.php,第30行]'在表單上:'警告(512):SQL錯誤:1048:列'cliente_id '不能爲空[CORE/cake/libs/model/datasources/dbo_source.php,第684行]' – ferpega

0

隨着@lxa我有得到它以這種方式運行評論:

更換function anadir與這一個(我有刪除註釋太):

function anadir($cliente_id, $nombre) { 
    if (!empty($this->data)) { 
       $this->Proyecto->create(); 
     if ($this->Proyecto->save($this->data)) { 
      $this->Session->setFlash('El proyecto ha sido grabado.'); 
      $this->redirect(array('controller'=>'clientes', 'action'=>'listar')); 
     } 
     } else { 
      $this->data['Proyecto']['cliente_id'] = $cliente_id; 
     } 
     $this->set('idcliente', $cliente_id); 
     $this->set('nombrecliente', $nombre); 
} 

真是這行做的伎倆:

$this->Proyecto->create();

它運行,但我不知道這是否是真的正確與否。

最後我開始看到Symfony2。也許學習曲線會比cakephp更大,但是cakephp給我帶來了很多關於外鍵和數據庫方式的問題。

問候並感謝有人試圖回答。