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?