CakePHP - 使用保存关联保存到两个以上的模型
CakePHP - saving to more than two models using save associated
我正在尝试更复杂的方法。我有一个存储所有一般项目的项目,我有一个产品,它是一个项目,我有一个商品,它是一个产品和一个项目。所以我有一个用于输入商品价值的表格,它将保存到所有与模型相关的表格(项目、产品、商品)中。这么多表的原因是因为所有表都应该有一个稍后使用的 id,例如:产品应该有它的 id,稍后用于销售。这是控制器:
public function add() {
$this->load();
if ($this->request->is('post')) {
$this->Item->create();
$this->request->data['Item']['code'] = $finalCode;
$this->request->data['Item']['is_deleted'] = false;
$item = $this->Item->save($this->request->data);
if(!empty($item)){
$this->request->data['Product']['item_id'] = $this->Item->id;
$this->request->data['Good']['item_id'] = $this->Item->id;
debug($this->request->data['Product']['item_id']);
debug($item);
$this->Item->Product->save($this->request->data);
$this->request->data['Good']['pid'] = $this->Product->id;
$this->Item->Good->save($this->request->data);
}
if($this->Good->validationErrors || $this->Item->validationErrors || $this->Product->validationErrors){
//ERRORS
}
else{
//FAILS
}
}
}
编辑:我已经更改了控制器,现在 Item 从未保存,但 Product 和 Good 被保存并且它们都映射得很好,id 没问题但 Item 甚至不在数据库中,尽管 Product 和 Good 有 item_id 设置为数据库中下一个值。
class Good extends AppModel {
public $belongsTo = array(
'Item' => array(
'className' => 'Item',
'foreignKey' => 'item_id',
),
'Product' => array(
'className' => 'Product',
'foreignKey' => 'pid',
)
);
}
class Product extends AppModel {
public $hasOne = array(
'Good' => array(
'className' => 'Good',
'foreignKey' => 'pid',
'dependent' => false,
),
);
}
class Item extends AppModel{
public $hasMany = array(
'Good' => array(
'className' => 'Good',
'foreignKey' => 'item_id',
'dependent' => false,
),
'Product' => array(
'className' => 'Product',
'foreignKey' => 'item_id',
'dependent' => false,
),
);
}
即使调试的 $item 看起来没问题,但没有保存:
array(
'Item' => array(
'name' => 'Microcontrollers',
'description' => 'Wire Jumpers Female-to-Female 30 cm',
'weight' => '22',
'measurement_unit_id' => '7',
'item_type_id' => '29',
'code' => 'GOD-34',
'is_deleted' => false,
'modified' => '2019-10-22 12:37:53',
'created' => '2019-10-22 12:37:53',
'id' => '120'
),
'Good' => array(
'status' => 'development',
'hts_number' => '8473 30 20',
'tax_group' => '20%',
'eccn' => 'EAR99',
'release_date' => array(
'month' => '10',
'day' => '22',
'year' => '2019',
'hour' => '10',
'min' => '10',
'meridian' => 'am'
),
'is_for_distributors' => '1'
),
'Product' => array(
'project' => 'neqwww'
)
)
我认为问题出在您保存数据的代码行。
$this->Item->create();
$this->Good->create();
$this->Product->create();
$this 是什么?如果您使用“$this”创建一个项目,然后尝试创建一个 "product",“$this”将不会有 item_id.
尝试使用类似这样的方法来保存创建的项目。
$item = $this->Item->create();
然后,在创建了 $item 之后,您可以使用 $item->id
创建一个 $product
更新:
来自 cakephp 文档。
// Create: id isn't set or is null
$this->Recipe->create();
$this->Recipe->save($this->request->data);
// Update: id is set to a numerical value
$this->Recipe->id = 2;
$this->Recipe->save($this->request->data);
您必须使用 $this->Item->save($data) 将信息保存到数据库中。
https://book.cakephp.org/2.0/en/models/saving-your-data.html
可能方法create()有点不清楚。用于重启模型状态。
所以,应该是
$item_saved = $this->Item->save($data['Item']);
$data['Product']['item_id'] = $this->Item->getLastInsertId();
$product_saved = $this->Product->save($data['Product']);
编辑 2:
可能是因为您在保存项目之前没有使用create()。请试试这个:
$this->Item->create();
$item_saved = $this->Item->save($data['Item']);
$data['Product']['item_id'] = $this->Item->getLastInsertId();
$product_saved = $this->Product->save($data['Product']);
我正在尝试更复杂的方法。我有一个存储所有一般项目的项目,我有一个产品,它是一个项目,我有一个商品,它是一个产品和一个项目。所以我有一个用于输入商品价值的表格,它将保存到所有与模型相关的表格(项目、产品、商品)中。这么多表的原因是因为所有表都应该有一个稍后使用的 id,例如:产品应该有它的 id,稍后用于销售。这是控制器:
public function add() {
$this->load();
if ($this->request->is('post')) {
$this->Item->create();
$this->request->data['Item']['code'] = $finalCode;
$this->request->data['Item']['is_deleted'] = false;
$item = $this->Item->save($this->request->data);
if(!empty($item)){
$this->request->data['Product']['item_id'] = $this->Item->id;
$this->request->data['Good']['item_id'] = $this->Item->id;
debug($this->request->data['Product']['item_id']);
debug($item);
$this->Item->Product->save($this->request->data);
$this->request->data['Good']['pid'] = $this->Product->id;
$this->Item->Good->save($this->request->data);
}
if($this->Good->validationErrors || $this->Item->validationErrors || $this->Product->validationErrors){
//ERRORS
}
else{
//FAILS
}
}
}
编辑:我已经更改了控制器,现在 Item 从未保存,但 Product 和 Good 被保存并且它们都映射得很好,id 没问题但 Item 甚至不在数据库中,尽管 Product 和 Good 有 item_id 设置为数据库中下一个值。
class Good extends AppModel {
public $belongsTo = array(
'Item' => array(
'className' => 'Item',
'foreignKey' => 'item_id',
),
'Product' => array(
'className' => 'Product',
'foreignKey' => 'pid',
)
);
}
class Product extends AppModel {
public $hasOne = array(
'Good' => array(
'className' => 'Good',
'foreignKey' => 'pid',
'dependent' => false,
),
);
}
class Item extends AppModel{
public $hasMany = array(
'Good' => array(
'className' => 'Good',
'foreignKey' => 'item_id',
'dependent' => false,
),
'Product' => array(
'className' => 'Product',
'foreignKey' => 'item_id',
'dependent' => false,
),
);
}
即使调试的 $item 看起来没问题,但没有保存:
array(
'Item' => array(
'name' => 'Microcontrollers',
'description' => 'Wire Jumpers Female-to-Female 30 cm',
'weight' => '22',
'measurement_unit_id' => '7',
'item_type_id' => '29',
'code' => 'GOD-34',
'is_deleted' => false,
'modified' => '2019-10-22 12:37:53',
'created' => '2019-10-22 12:37:53',
'id' => '120'
),
'Good' => array(
'status' => 'development',
'hts_number' => '8473 30 20',
'tax_group' => '20%',
'eccn' => 'EAR99',
'release_date' => array(
'month' => '10',
'day' => '22',
'year' => '2019',
'hour' => '10',
'min' => '10',
'meridian' => 'am'
),
'is_for_distributors' => '1'
),
'Product' => array(
'project' => 'neqwww'
)
)
我认为问题出在您保存数据的代码行。
$this->Item->create();
$this->Good->create();
$this->Product->create();
$this 是什么?如果您使用“$this”创建一个项目,然后尝试创建一个 "product",“$this”将不会有 item_id.
尝试使用类似这样的方法来保存创建的项目。
$item = $this->Item->create();
然后,在创建了 $item 之后,您可以使用 $item->id
创建一个 $product更新:
来自 cakephp 文档。
// Create: id isn't set or is null
$this->Recipe->create();
$this->Recipe->save($this->request->data);
// Update: id is set to a numerical value
$this->Recipe->id = 2;
$this->Recipe->save($this->request->data);
您必须使用 $this->Item->save($data) 将信息保存到数据库中。
https://book.cakephp.org/2.0/en/models/saving-your-data.html
可能方法create()有点不清楚。用于重启模型状态。
所以,应该是
$item_saved = $this->Item->save($data['Item']);
$data['Product']['item_id'] = $this->Item->getLastInsertId();
$product_saved = $this->Product->save($data['Product']);
编辑 2:
可能是因为您在保存项目之前没有使用create()。请试试这个:
$this->Item->create();
$item_saved = $this->Item->save($data['Item']);
$data['Product']['item_id'] = $this->Item->getLastInsertId();
$product_saved = $this->Product->save($data['Product']);