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