CakePHP tuhaf SaveAll sorunu.

0 Cevap php

Ben iki model var, Statement -> hasMany -> LineItem.

I Statement 's yöntemlerden biri içinde $this->saveAll() için aşağıdaki dizisi geçirerek ediyorum:

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

Ben veritabanında statements tablosunu kontrol zaman $this->saveAll($data) == true, ama boştur. Garip bit? Auto_increment id kolon Bu da $this->Statement->id tablonun mevcut AUTO_INCREMENT eşleşen gerçeği ile yansıtılır. 1 arttırılır edilmiştir.

Yukarıdakilerin hepsi de line_items tablo için de geçerlidir, ancak auto_increment 3 ile artan.

Update

$this->save($data) kullanırken, Bildirimi (LineItem kayıtları olmadan, elbette) doğru olarak kaydedilir. Peki, SaveAll ile kalmış?

Update

Yani, sorun bir yerde benim denetleyicisi veya modeli olduğunu varsayalım. Eminim bazı aptal doh! an. İşte benim denetleyicisi ve benim modeli (yorum ve kısalık için kaldırıldı ilgisiz kodu) kodu.

İlk olarak, model:

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;
    }
}

Ve denetleyici:

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

SatırÖğesi modeli çok özlü:

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

Getting Somewhere

Ben denetleyici yöntemi yönlendirme kapalı ve SQL dökümü bir göz attım:

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')  

Işlem geri alınır ediliyor.

Peki neden statement_id SaveAll kullanırken işlem sorguya eklenen değil mi?

0 Cevap