Несколько идентичных правых отношений - PullRequest
0 голосов
/ 08 июня 2018

У меня есть таблицы products, attributes и product_attributes.Каждый продукт может иметь несколько attributes, и эти отношения хранились в product_attributes, пока все хорошо.Но продукт может иметь один и тот же атрибут несколько раз.Я только могу связать различные атрибуты с продуктом.

Например:

Audi (товар) имеет Колесо (атрибут): Сумма (joinData)= 2; Значение (joinData) = "front";

И

Audi (товар) имеет Колесо (атрибут): Сумма (joinData) = 2; Значение (joinData) = "Rear";

Сохраняется только колесо атрибута со значением сзади, передние колеса теряются.

Нет ошибок в контроллере.

Это вывод $this->request->getData()

/src/Controller/ProductsController.php (line 62)
[
    'type_id' => '12',
    'name' => 'Audi',
    'thumbnail' => '',
    'image' => '',
    'attributes' => [
        (int) 0 => [
            'unique_id' => '9',
            '_joinData' => [
                'amount' => '2',
                'value' => '1',
                'information' => 'front'
            ]
        ],
        (int) 1 => [
            'unique_id' => '9',
            '_joinData' => [
                'amount' => '2',
                'value' => '1',
                'information' => 'rear'
            ]
        ]
    ]
]

Это вывод $product после patchEntity:

object(App\Model\Entity\Product) {

    'type_id' => (int) 12,
    'name' => 'Audi',
    'thumbnail' => '',
    'image' => '',
    'attributes' => [
        (int) 0 => object(App\Model\Entity\Attribute) {

            'unique_id' => (int) 9,
            'category_id' => (int) 8,
            'name' => 'VDSL2',
            'unit' => '',
            '_joinData' => object(App\Model\Entity\ProductsAttribute) {

                'amount' => (int) 2,
                'value' => (float) 1,
                'information' => 'rear',
                '[new]' => true,
                '[accessible]' => [
                    '*' => true
                ],
                '[dirty]' => [
                    'amount' => true,
                    'value' => true,
                    'information' => true
                ],
                '[original]' => [],
                '[virtual]' => [],
                '[errors]' => [],
                '[invalid]' => [],
                '[repository]' => 'ProductsAttributes'

            },
            '[new]' => false,
            '[accessible]' => [
                '*' => true
            ],
            '[dirty]' => [
                '_joinData' => true
            ],
            '[original]' => [
                '_joinData' => [
                    'amount' => '2',
                    'value' => '0',
                    'information' => 'front'
                ]
            ],
            '[virtual]' => [],
            '[errors]' => [],
            '[invalid]' => [],
            '[repository]' => 'Attributes'

        },
        (int) 1 => object(App\Model\Entity\Attribute) {

            'unique_id' => (int) 9,
            'category_id' => (int) 8,
            'name' => 'VDSL2',
            'unit' => '',
            '_joinData' => object(App\Model\Entity\ProductsAttribute) {

                'amount' => (int) 2,
                'value' => (float) 1,
                'information' => 'rear',
                '[new]' => true,
                '[accessible]' => [
                    '*' => true
                ],
                '[dirty]' => [
                    'amount' => true,
                    'value' => true,
                    'information' => true
                ],
                '[original]' => [],
                '[virtual]' => [],
                '[errors]' => [],
                '[invalid]' => [],
                '[repository]' => 'ProductsAttributes'

            },
            '[new]' => false,
            '[accessible]' => [
                '*' => true
            ],
            '[dirty]' => [
                '_joinData' => true
            ],
            '[original]' => [
                '_joinData' => [
                    'amount' => '2',
                    'value' => '0',
                    'information' => 'front'
                ]
            ],
            '[virtual]' => [],
            '[errors]' => [],
            '[invalid]' => [],
            '[repository]' => 'Attributes'

        }
    ],
    '[new]' => true,
    '[accessible]' => [
        'type_id' => true,
        'name' => true,
        'thumbnail' => true,
        'image' => true,
        'type' => true,
        'attributes' => true
    ],
    '[dirty]' => [
        'type_id' => true,
        'name' => true,
        'thumbnail' => true,
        'image' => true,
        'attributes' => true
    ],
    '[original]' => [],
    '[virtual]' => [],
    '[errors]' => [],
    '[invalid]' => [],
    '[repository]' => 'Products'

}

ProductControllerДобавить функцию:

public function add(){
        $product = $this->Products->newEntity();
        if ($this->request->is('post')) {
            $product = $this->Products->patchEntity($product, $this->request->getData(), [
                'associated' => [
                     'Attributes',
                     'Attributes._joinData'
                ]
            ]);
            /*debug($this->request->getData());
            debug($product);
            die();*/
            if ($this->Products->save($product)) {
                $this->Flash->success(__('The product has been saved.'));

                return $this->redirect(['action' => 'index']);
            }
            $this->Flash->error(__('The product could not be saved. Please, try again.'));
        }
        $types = $this->Products->Types->find('list', ['limit' => 200]);
        $attributes = $this->Products->Attributes->find('list', ['limit' => 200]);
        $this->set(compact('product', 'types', 'attributes'));
}

Это как-то связано с моими отношениями.

Таблица продуктов:

$this->belongsToMany('Attributes', [
    'foreignKey' => 'product_id',
    'targetForeignKey' => 'attribute_id',
    'joinTable' => 'products_attributes'
]);

Таблица атрибутов:

$this->belongsToMany('Products', [
    'foreignKey' => 'attribute_id',
    'targetForeignKey' => 'product_id',
    'joinTable' => 'products_attributes'
]);

Эти атрибуты product_attributes имеют в БД:

unique_iq INT,
product_id INT,
attribute_id INT,
amount INT,
value DOUBLE,
information VARCHAR(150)

Стратегия сохранения не решает мою проблему.Все тот же результат.

1 Ответ

0 голосов
/ 08 июня 2018

Просто обходной путь, но он должен работать.В ожидании еще одного торта

Поскольку вы в основном хотите заполнить таблицы products и product_attributes, вы можете установить новые отношения следующим образом

Таблица продуктов:

$this->hasMany('ProductsAttributes', [ /* configure keys here */ ]);

И сформируйте данные таким образом

[
    'type_id' => '12',
    'name' => 'Audi',
    'thumbnail' => '',
    'image' => '',
    'products_attributes' => [
        [
            'attribute_id' => '9',
            'amount' => '2',
            'value' => '1',
            'information' => 'front'
        ],
        [
            'attribute_id' => '9',
            'amount' => '2',
            'value' => '1',
            'information' => 'rear'
        ]
    ]
]

Это создаст новую строку в products и две новые строки в product_attributes

...