cakephp和add方法(外键)
刚开始使用cakephp,几年后基本上不用它了 我有这样一个表结构: 父表。。。。。。客户: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') );
<?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ñ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ñ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ñ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);