CakePHP странное сохранениеВсе проблемы. Возвращает true, но ничего в базе данных - PullRequest
0 голосов
/ 02 ноября 2010

У меня есть две модели, Statement -> hasMany -> LineItem.

Я передаю следующий массив $this->saveAll() внутри одного из Statement методов:

$data = array(
    'Statement' => array(
        'employee_id' => 1
    ),
    'LineItem' => array(
        0 => array('job_id' => 1),
        1 => array('job_id' => 9),
        2 => array('job_id' => 12),
    )
);

$this->saveAll($data) == true, но когда я проверяю таблицу statements в базе данных, она пуста. Странный бит? Столбец auto_increment id был увеличен на 1. Это также отражается в том факте, что $this->Statement->id соответствует текущему auto_increment таблицы.

Все вышесказанное верно и для таблицы line_items, только auto_increment был увеличен на 3.

Обновление

При использовании $this->save($data) выписка сохраняется правильно (конечно, без записей LineItem). Итак, что случилось с saveAll?

Обновление

Итак, я предполагаю, что проблема где-то в моем контроллере или модели. Какой-то глупый дох! момент, я уверен. Вот код моего контроллера и моей модели (комментарии и несвязанный код для краткости удалены).

Сначала модель:

class Statement extends AppModel {
    public $belongsTo = array('CompanyStatement', 'Employee');
    public $hasMany = array('LineItem');
    public $name = 'Statement';

    public function build_statement($data = NULL) {
        if (!empty($data)) {
            if ($this->saveAll($data)) {
                $result = array(
                    'message' => 'Statement was saved.',
                    'element' => 'flash_success',
                    'success' => TRUE
                );
            } else {
                $result = array(
                    'message' => 'There was a problem saving.',
                    'element' => 'flash_error',
                    'success' => FALSE
                );
            }
        } else {
            $result = array(
                'message' => 'No data was received.',
                'element' => 'flash_error',
                'success' => FALSE
            );
        }
        return $result;
    }
}

И контроллер:

 class StatementsController extends AppController {
    public $name = 'Statements';

    public function create_new_statement() {
        $result = $this->Statement->build_statement($this->data);
        $this->Session->setFlash($result['message'], $result['element']);
        $this->redirect(array(
            'controller' => 'statements',
            'action' => 'edit',
            $this->Statement->id
        ));
    }
    public function edit($id = NULL) {
        $this->set('statement' => $this->Statement->findById($id));
    }
 }

Модель LineItem очень лаконична:

class LineItem extends AppModel {
    public $name = 'LineItem';
    public $belongsTo = array('Statement', 'Job');
}

Как добраться

Я отключил перенаправление в методе контроллера и взглянул на дамп SQL:

Warning (512): SQL Error: 1452: Cannot add or update a child row:
a foreign key constraint fails (`database`.`line_items`,
CONSTRAINT `line_items_ibfk_1`
FOREIGN KEY (`statement_id`) REFERENCES `statements` (`id`)
ON DELETE CASCADE ON UPDATE NO ACTION)

[CORE\cake\libs\model\datasources\dbo_source.php, line 681]

Query: INSERT INTO `line_items` (`job_id`, `modified`, `created`) VALUES (1, '2010-11-02 15:22:39', '2010-11-02 15:22:39') 
Query: INSERT INTO `line_items` (`job_id`, `modified`, `created`) VALUES (9, '2010-11-02 15:22:39', '2010-11-02 15:22:39') 
Query: INSERT INTO `line_items` (`job_id`, `modified`, `created`) VALUES (10, '2010-11-02 15:22:39', '2010-11-02 15:22:39')  

Транзакция откатывается.

Так почему же statement_id не добавляется в запрос в транзакции при использовании saveAll?

Ответы [ 3 ]

2 голосов
/ 02 ноября 2010

Это случается со мной время от времени, когда я забываю совершать транзакции. Вы отключили автокоммит? Вы используете транзакции? Вы забыли зафиксировать или сказали, что cakePHP нужно зафиксировать?

1 голос
/ 02 ноября 2010

По умолчанию Cake ожидает, что внешний ключ на line_items будет Statement_id.Вы не показали структуры таблицы.Есть ли на самом деле столбец Statement_id на line_items?

0 голосов
/ 02 ноября 2010
$this->saveAll();

не будет работать, вместо этого попробуйте:

$this->Statement->saveAll();
/* or */
$this->LineItem->saveAll();
...