cakephp и метод add (внешние ключи) - PullRequest
0 голосов
/ 14 июля 2011

только начиная с cakephp и почти с php через несколько лет без его использования ....

У меня есть такая структура таблицы: Родительская таблица ...... Клиенты:

<?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) изиндексное представление клиента.Итак, у меня есть метод 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);
    }

Я могу показать родительский клиент (id и номер) в представлении anadir.ctp, но он всегда обновляет один и тот же проект, изменяятолько имя и описание.В таблице не делается ADD / INSERT, только ОБНОВЛЕНИЕ.

<!-- 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 Возможно, начать труднее, но я надеюсь, что более гибким (с несколькими PrimaryКлючи и поддержка внешних ключей, в основном) и ясно, чем CakePHP.

Ответы [ 4 ]

1 голос
/ 14 июля 2011

выше модели такие же

, но измените код ниже и попробуйте

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 голосов
/ 16 июля 2011

Так что все еще выглядит (как предложено deizel ), что в вашем $this->data как-то установлено id, возможно, поле с ошибкой в ​​форме, не уверен (вы можете опубликовать свой посмотреть здесь, чтобы мы могли посмотреть). Лучший способ проверить это - отслеживать реальные запросы 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 голосов
/ 16 июля 2011

С комментарием @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 дает мне много проблем с внешними ключами и способом работы с базами данных.

Привет и спасибо кому-то, кто пытается ответить.

0 голосов
/ 14 июля 2011

CakePHP выполнит обновление, если в ваших данных есть идентификатор:

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

Раскомментируйте следующую строку и убедитесь, что значение $this->data['Proyecto']['id'] отсутствует:

//                        print_r($this->data);
...