CakePHP - сохранение более чем в две модели с использованием сохранения, связанного - PullRequest
0 голосов
/ 21 октября 2019

Я пытаюсь что-то более сложное. У меня есть Предмет, в котором хранятся все общие предметы, у меня есть Товар, который является предметом, и у меня есть Товар, который представляет собой товар и предмет. Таким образом, у меня есть форма для ввода стоимости товара, и она будет сохранена во всех таблицах, связанных с моделью (товары, товары, товары). Причиной такого количества таблиц является то, что у всех таблиц должен быть идентификатор, который используется позже, например: у продукта должен быть свой идентификатор, который позже будет использоваться для продажи. Вот контроллер:

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

РЕДАКТИРОВАТЬ: я изменил контроллер, и теперь элемент никогда не сохраняется, но продукт и товар сохраняется, и все они сопоставлены хорошо, идентификаторы в порядке, но элемент даже не вдля db, althrough Product и Good установлено значение item_id, которое должно быть следующим в db.

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

}

Даже отлаженный элемент $ выглядит нормально, но не сохраняется:

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

1 Ответ

1 голос
/ 21 октября 2019

Я думаю, что проблема в вашем коде в строках, где вы сохраняете данные.

$this->Item->create();
$this->Good->create();
$this->Product->create();

Что такое $ this? Если вы создаете элемент с «$ this», а затем пытаетесь создать «product», у «$ this» не будет item_id.

Попробуйте использовать что-то подобное для сохранения созданного элемента.

$item = $this->Item->create();

Затем, с созданием этого $ item, вы можете создать $ product с $ item-> id

Обновление:

Из документации к тортхпу.

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

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