Multiple identical entitiy relation

为君一笑 提交于 2019-12-24 08:47:19

问题


I've got a products, attributes, and product_attributes table. Each product can have multiple attributes and these relations were stored in product_attributes, so far so good. But a product can have the same attribute multiple times. I just only can link different attributes to a product.

For example:

Audi(product) has Wheel(attribute): Amount(joinData) = 2; Value(joinData) = "front";

And

Audi(product) has Wheel(attribute): Amount(joinData) = 2; Value(joinData) = "rear";

Only the attribute wheel with value rear is saved the front wheels are lost.

No errors in controller.

This is the output of $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'
            ]
        ]
    ]
]

This is the output of $product after 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 Add function:

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

It has something to do with my relations.

Product Table:

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

Attribute Table:

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

These are the attributes product_attributes have in the DB:

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

Save Strategy doesn't solve my problem. Still same result.


回答1:


Just a workaround but it should work. Waiting for a more cake way

Since you basically want to fill products and product_attributes tables you can set a new relationship this way

Product Table:

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

And shape you data this way

[
    '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'
        ]
    ]
]

This will create a new row in products and two new rows in product_attributes



来源:https://stackoverflow.com/questions/50761347/multiple-identical-entitiy-relation

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!