Сохранение связанных с HABTM данных в cakephp

#php #cakephp #has-and-belongs-to-many

#php #cakephp #имеет и принадлежит многим

Вопрос:

У меня небольшая проблема. Моя товарная модель имеет и принадлежит многим ассоциациям с пользовательской моделью. В БД они связаны через commodities_users таблицу. Итак, я хочу, чтобы Cakephp создавал новые записи в commodities_users таблице в БД при создании нового товара. Но это не работает. Мой $this->request->data массив (когда я хочу сохранить один новый товар) выглядит следующим образом

 array(
    'Commodity' => array(
        'commodity_type' => '0',
        'commoditygroup_id' => '',
        'name' => 'asdfad',
        'code' => '',
        'ean' => '',
        'costprice' => '',
        'saleprice' => '12512,123',
        'default_vatrate' => '',
        'saleprice_gross' => '',
        'sync_cashconnector' => '1',
        'commoditysetting_id' => '',
        'default_amount_enabled' => '0',
        'default_amount' => '',
        'stock_min' => '',
        'stock' => '',
        'comment' => ''
    ),
    'User' => array(
        (int) 0 => array(
            'id' => '23'
        ),
        (int) 1 => array(
            'id' => '24'
        ),
        (int) 2 => array(
            'id' => '30'
        ),
        (int) 3 => array(
            'id' => '31'
         )
));
  

И я сохраняю товарную модель таким образом $this->Commodity->saveAll($this->request->data);

Моя версия CakePHP — 2.4. Взаимосвязь

 var $hasAndBelongsToMany = array(
            'User' => array(
                    'className' => 'User',
                    'joinTable' => 'commodities_users',
                    'foreignKey' => 'commodity_id',
                    'associationForeignKey' => 'user_id',
            ),
    );
  

Что я делаю не так?

Комментарии:

1. Вы не указали свою версию cakephp, а также не отобразили свои отношения в коде модели и схеме таблицы. если вы поделитесь, вам будет легче помочь

2. @tarikul05, посмотри, я внес некоторые изменения.

3. Не могли бы вы добавить «public» вместо » var» в вашем отношении,

4. @tarikul05, с другими моделями это работает, поэтому я не думаю, что это проблема

5. @ВладиславВадимович можете ли вы сохранить данные в таблице товаров?

Ответ №1:

Вы не вводите правильные данные saveAll() .

Согласно документам CakePHP, правильный способ структурирования ваших данных заключается в следующем:

 array(
    array(
        'Commodity' => array(
            'commodity_type' => '0',
            'commoditygroup_id' => '',
            'name' => 'asdfad',
            'code' => '',
            'ean' => '',
            'costprice' => '',
            'saleprice' => '12512,123',
            'default_vatrate' => '',
            'saleprice_gross' => '',
            'sync_cashconnector' => '1',
            'commoditysetting_id' => '',
            'default_amount_enabled' => '0',
            'default_amount' => '',
            'stock_min' => '',
            'stock' => '',
            'comment' => ''
        ),
        'User' => array(
            'User' => array('23','24','30','31')
        )
    )
);
  

Затем вы сохраняете данные с помощью:

 $this->Commodity->saveAll($this->request->data, array('deep' => true)) 
  

Для получения дополнительной информации см.

Ответ №2:

Хорошо, я решил это сам. Я был таким дураком и написал ассоциацию HABTM только в Commodity Model. Добавление того же для пользовательской модели устранило проблему. И $this->reuqest->data массив выглядел так

 array(
    'Commodity' => array(
        'commodity_type' => '0',
        'commoditygroup_id' => '',
        'name' => 'asdfad',
        'code' => '',
        'ean' => '',
        'costprice' => '',
        'saleprice' => '12512,123',
        'default_vatrate' => '',
        'saleprice_gross' => '',
        'sync_cashconnector' => '1',
        'commoditysetting_id' => '',
        'default_amount_enabled' => '0',
        'default_amount' => '',
        'stock_min' => '',
        'stock' => '',
        'comment' => ''
    ),
    'User' => array(
        'id' => array(
            '0' => '23',
            '1' => '24',
            '2' => '25'

));
  

Спасибо за ваше время!