2011-07-14 29 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给我带来了很多关于外键和数据库方式的问题。

问候并感谢有人试图回答。