多个相同的权利关系

时间:2018-06-08 13:08:23

标签: php mysql cakephp cakephp-3.0

我有productsattributesproduct_attributes表格。 每个产品可以有多个attributes,这些关系存储在product_attributes中,到目前为止一直很好。 但是产品可以多次具有相同的属性。我只能将不同的属性链接到产品。

例如:

  

奥迪(产品) Wheel (属性):金额(joinData)= 2;   (joinData)=“前”;

  

奥迪(产品) Wheel (属性):金额(joinData)= 2;   (joinData)=“后方”;

只保存后面带的属性轮,前轮丢失。

控制器没有错误。

这是$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'
            ]
        ]
    ]
]

这是patchEntity之后$product的输出:

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 :(得分:2)

只是解决方法,但它应该工作。等待更多的蛋糕方式

由于您基本上想填写productsproduct_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

中创建两个新行