cakephp和add方法(外键)

cakephp和add方法(外键),cakephp,foreign-keys,cakephp-1.3,add,Cakephp,Foreign Keys,Cakephp 1.3,Add,刚开始使用cakephp,几年后基本上不用它了 我有这样一个表结构: 父表。。。。。。客户: <?php class Cliente extends AppModel { var $name = 'Cliente'; var $validate = array( 'nombre' => array('rule'=>'notEmpty') );

刚开始使用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                
            )
        );
}
?>

和子表:项目.. 一个客户可以分配多个项目

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

只能从索引客户端视图添加(插入)项目。因此,我有一个add(anadir)方法:

函数anadir($cliente\u id,$nombre){
如果(!empty($this->data)){
//echo“El código de cliente 22222:”.$this->data['Proyecto']['id']。“
”; //echo“El código de cliente fk:”.$this->data['Proyecto']['cliente_id']。“
”; //打印($this->data); //$this->data['Proyecto']['cliente\u id']=$cliente\u id; 如果($this->Proyecto->save($this->data)){ $this->Session->setFlash('El proyecto ha sido grabado'); $this->redirect(数组('controller'=>'clientes','action'=>'listar'); } }否则{ //echo“El código de cliente 11111:”.$this->data['Proyecto']['id']; $this->data['Proyecto']['cliente\u id']=$cliente\u id; } $this->set('idcliente',$cliente\u id); $this->set('nombreclient',$nombre); }
我可以在“anadir.ctp”视图中显示父客户端(id和编号),但它总是更新相同的项目,只更改名称和描述。表中没有添加/插入,只有更新

<!-- 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'));
?>

安蒂尔德;a客户的adir项目

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

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

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

//                        print_r($this->data);
以上型号相同

但请更改下面的代码并重试

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'));
?>
函数anadir(){//add方法没有neet参数
如果(!empty($this->data)){
//echo“El código de cliente 22222:”.$this->data['Proyecto']['id']。“
”; //echo“El código de cliente fk:”.$this->data['Proyecto']['cliente_id']。“
”; //打印($this->data); //$this->data['Proyecto']['cliente\u id']=$cliente\u id; 如果($this->Proyecto->save($this->data)){ $this->Session->setFlash('El proyecto ha sido grabado'); $this->redirect(数组('controller'=>'clientes','action'=>'listar'); } }否则{ //echo“El código de cliente 11111:”.$this->data['Proyecto']['id']; $this->data['Proyecto']['cliente\u id']=$cliente\u id; } $this->set('idcliente',$cliente\u id); $this->set('nombreclient',$nombre); } 安蒂尔德;a客户的adir项目
在@lxa的注释下,我让它以如下方式运行:

用这个函数替换
函数anadir
(我也有删除注释):

这句话真的很管用:

$this->Proyecto->create()

它运行,但我不知道它是否真的正确

我终于开始看到Symfony2了。也许学习曲线会比cakephp更大,但是cakephp给了我很多关于外键的问题,以及在数据库上的执行方式

问候并感谢试图回答问题的人。

所以看起来(正如deizel所建议的)您在
$this->data
中设置了
id
,可能是表单中的字段有误,不确定(您可以在此处发布视图,以便我们查看)。检查它的最好方法是监视实际的SQL查询;将其置于
$this->Model->save()
之后(出于调试目的,尚未添加
$this->Model->create()):

将上面的输出添加到您的问题中

关于
$this->Model->create()
:在
$this->Model->save()
之前调用它是完全可以的,甚至是推荐的。这就像变量初始化一样——您可以跳过它,但风险自负,因为您完全确定自己在做什么


若要解决ProyectosController::anadir()的
缺少参数1的错误,您应该在此处发布URL。它应该类似于
/proyectos/anadir/2/10

$this->data['Proyecto']['id']
为空。我之前已经检查过了(这就是注释
echo
行的原因)。我取消了对该行的注释,结果是:
Array([Proyecto]=>Array([cliente_id]=>3[nombre]=>p17[description]=>p17…x))
再次检查
id
是否存在,是否是
Proyecto
DB表中的主键(而不是
cliente_id
)。为了确保这一点,请将
$this->Proyecto->create()if($this->Proyecto->save($this->data)){
前面的行。DB表是正常的(我想)…id是主键。如果我把
$this->Proyecto->create();
放在你说的地方,那么项目就保存好了…还有另一个与函数anadir(arg1,arg2)相关的错误-->Ie:
缺少ProyectosController::anadir()[APP/controllers/proyectos_controller.php,第18行]
hummmm….sdadmdmfaskdfkqwkfkqwefi的参数1我尝试过这种方法,我有几个警告:未定义的变量:
未定义的变量:cliente_id[APP/controllers/proyectos_controller.php,第30行]
和表单帖子:
警告(512):SQL错误:1048:Column'cliente_id'不能为null[CORE/cake/libs/model/datasources/dbo_source.php,第684行]
我在原始问题上添加了调试($log)的详细信息。保存后添加日志记录(即
$this->Proyecto->->save($this->data)
)-当前它不显示任何
更新
/
插入
查询。但是
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'));
?>
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);
}
$log = $this->Model->getDataSource()->getLog(false, false);
debug($log);