cakephp和add方法(外键)

时间:2011-07-14 10:05:40

标签: cakephp foreign-keys cakephp-1.3 add

刚开始使用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)Proyects。所以,我有这个add(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'视图中显示父客户端(id和number),但它总是更新相同的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更清晰。

4 个答案:

答案 0 :(得分: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'));
?>

答案 1 :(得分:0)

如果此时数据中存在ID,CakePHP将执行更新:

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

取消注释以下行并检查没有$this->data['Proyecto']['id']值:

//                        print_r($this->data);

答案 2 :(得分: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给了我很多外键问题和数据库方式。

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

答案 3 :(得分: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()错误,您应该在此处发布您的网址。它应该是/proyectos/anadir/2/10