2017-03-03 69 views
1

我有兩個表: -CakePHP的3.x的數據插入到兩個表

銷售

CREATE TABLE `sales` (
    `id` int(10) NOT NULL AUTO_INCREMENT, 
    `title` varchar(255) DEFAULT NULL, 
    `description` text, 
    `quantity` int(10) DEFAULT NULL, 
    `price` decimal(18,2) DEFAULT NULL, 
    `payment_method_id` int(10) DEFAULT NULL, 
    `user_id` int(10) DEFAULT NULL, 
    `created` datetime DEFAULT NULL, 
    `modified` datetime DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; 

sale_details

CREATE TABLE `sale_details` (
    `id` int(10) NOT NULL AUTO_INCREMENT, 
    `sale_id` int(10) DEFAULT NULL, 
    `product_id` int(10) DEFAULT NULL, 
    `quantity` int(10) DEFAULT NULL, 
    `price` decimal(18,2) DEFAULT NULL, 
    `total_price` decimal(18,2) DEFAULT NULL, 
    `created` datetime DEFAULT NULL, 
    `modified` datetime DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; 

我需要將數據插入到這些表相應地使用ajax。首先,我將我的數組數據組織到以下內容中。

這裏是我的數據

[ 
    'quantity' => 3, 
    'price' => 63, 
    'payment_method_id' => 1, 
    'user_id' => 1, 
    'sale_details' => [ 
     0 => [ 
      'product_id' => 1, 
      'quantity' => 2, 
      'price' => 24, 
      'total_price' => 48 
     ], 
     1 => [ 
      'product_id' => 49, 
      'quantity' => 1, 
      'price' => 15, 
      'total_price' => 15 
     ] 
    ] 
] 

SalesController.php

if ($this->request->is('ajax')) { 

    $sales = $this->Sales->newEntity(
     $this->request->data(), 
     [ 
      'validate' => 'create', 
      'associated' => [ 
       'SaleDetails' => ['validate' => 'create'] 
      ] 
     ] 
    ); 

    if ($this->Sales->save($sales)) { 
     //code 
    } 
} 

我設法將數據插入到這些表,但兩個表的主鍵保持與另外數增加2.我插入數據3次。 下面是如何記錄的數據: -

銷售

id title description quantity price payment_method_id user_id created    modified    
------ ------ ----------- -------- ------ ----------------- ------- ------------------- --------------------- 
    1 (NULL) (NULL)    3 63.00     1  1 2017-03-03 11:37:11 2017-03-03 11:37:11 

sale_details

id sale_id product_id quantity price total_price created    modified    
------ ------- ---------- -------- ------ ----------- ------------------- --------------------- 
    1  1   1   2 24.00 48.00  2017-03-03 11:37:11 2017-03-03 11:37:11 
    2  1   49   1 15.00 15.00  2017-03-03 11:37:11 2017-03-03 11:37:11 

你可以從表中注意到, 銷售表ID與增加加2和它碰巧 sale_details表。

我的問題如下: -

1)我有點新的CakePHP 3,所以這是將數據保存到多個表中正確的方法?我刪除了以下幾行,我仍然可以將數據保存到這些表中。如何處理'關聯'在這裏?

SalesController.php

if ($this->request->is('ajax')) { 

    $sales = $this->Sales->newEntity(
     $this->request->data(), 
     [ 
      'validate' => 'create', 
      /*'associated' => [ 
       'SaleDetails' => ['validate' => 'create'] 
      ]*/ // removed 
     ] 
    ); 

    if ($this->Sales->save($sales)) { 
     //code 
    } 
} 

2)我不明白,爲什麼那些ID與添加2.增加我敢肯定,我已經設置AUTO_INCREMENT = 1針對表。

系統變量auto_increment_increment已被設置爲2.不知道這怎麼可能發生。

在此先感謝。

回答

1

是的,這是保存關聯的正確方法。

即使沒有通過associated選項指定它們,您的關聯仍然正在轉換(並因此保存),因爲默認情況下允許使用第一級關聯,即在刪除選項時可以轉換所有第一級關聯,並且在指定如你的例子所示,只有SaleDetails關聯可以被轉換。從文檔

行情:

默認情況下,所有在該表上的關聯將水合。您可以限制哪些協會是建立,或包括使用的選項參數

API > \Cake\ORM\Table::newEntity()

當你保存一個實體更深的關聯,也可以選擇保存的部分或全部相關的實體。默認情況下,所有第一級實體將被保存。

Cookbook > Datbase Access & ORM > Saving Data > Saving Associations

參見