2016-12-11 4 views
0

Ich habe Probleme beim Aktualisieren vorhandener Daten in meiner Join-Tabelle. Hier geht es ...CakePHP 3 Aktualisieren von Daten in der Join-Tabelle

Ich habe 2 Modelle SalesOrders und Produkte, die eine assignesToMany Verbindung über LineItems haben.

products 
+-------------+---------------------+------+-----+---------+----------------+ 
| Field  | Type    | Null | Key | Default | Extra   | 
+-------------+---------------------+------+-----+---------+----------------+ 
| id   | int(11) unsigned | NO | PRI | NULL | auto_increment | 
| name  | int(11)    | NO |  | NULL |    | 
+-------------+---------------------+------+-----+---------+----------------+ 

sales_orders 
+--------------+---------------------+------+-----+---------+----------------+ 
| Field  | Type    | Null | Key | Default | Extra   | 
+--------------+---------------------+------+-----+---------+----------------+ 
| id   | int(11) unsigned | NO | PRI | NULL | auto_increment | 
| order_number | int(11)    | NO |  | NULL |    | 
+--------------+---------------------+------+-----+---------+----------------+ 

line_items 
+----------------+---------------------+------+-----+---------+----------------+ 
| Field   | Type    | Null | Key | Default | Extra   | 
+----------------+---------------------+------+-----+---------+----------------+ 
| id    | int(11) unsigned | NO | PRI | NULL | auto_increment | 
| sales_order_id | int(11) unsigned | NO |  | NULL |    | 
| product_id  | int(11) unsigned | NO |  | NULL |    | 
| qty   | int(11)    | NO |  | NULL |    | 
+----------------+---------------------+------+-----+---------+----------------+

Das Erstellen eines neuen Kundenauftrags funktioniert wie erwartet. Ich kann einem Kundenauftrag mehrere Produkte und Mengen auf der Seite zum Hinzufügen neuer Kundenaufträge hinzufügen. Alle korrekten Daten werden der Join-Tabelle hinzugefügt.

Das Problem, das ich habe, ist, wenn ich versuche, einen bestehenden Kundenauftrag zu bearbeiten. Ich möchte beispielsweise die Menge einer bestimmten Werbebuchung von 5 auf 2 ändern. Ich öffne die Bearbeitungsseite für den Kundenauftrag, den ich bearbeiten möchte, ändere die Menge der gewünschten Werbebuchung und sende das Formular ab. Das Formular wird erfolgreich übermittelt, die Join-Tabelle wird jedoch nicht aktualisiert. Das scheint eine ziemlich grundlegende Funktionalität zu sein, die ich nicht funktioniere. Mein gesamter Code wurde mit ein paar kleinen Modifikationen gebacken.

SalesOrdersTable:

$this->belongsToMany('Products', [ 
    'foreignKey' => 'sales_order_id', 
    'targetForeignKey' => 'product_id', 
    'through' => 'LineItems', 
]); 

ProductsTable:

$this->belongsToMany('SalesOrders', [ 
    'foreignKey' => 'product_id', 
    'targetForeignKey' => 'sales_order_id', 
    'through' => 'LineItems', 
]); 

LineItemsTable:

$this->belongsTo('Products', [ 
    'foreignKey' => 'product_id', 
    'joinType' => 'INNER' 
]); 
$this->belongsTo('SalesOrders', [ 
    'foreignKey' => 'sales_order_id', 
    'joinType' => 'INNER' 
]); 

SalesOrdersController edit:

public function edit($id = null) 
{ 
    $salesOrder = $this->SalesOrders->get($id, [ 
     'contain' => ['Products'] 
    ]); 
    if ($this->request->is(['patch', 'post', 'put'])) { 
     $salesOrder = $this->SalesOrders->patchEntity($salesOrder, $this->request->data); 
     if ($this->SalesOrders->save($salesOrder)) { 
      $this->Flash->success(__('The sales order has been saved.')); 

      return $this->redirect(['action' => 'index']); 
     } else { 
      $this->Flash->error(__('The sales order could not be saved. Please, try again.')); 
     } 
    } 
    $products = $this->SalesOrders->Products->find('list', ['limit' => 200]); 
    $this->set(compact('salesOrder', 'products')); 
    $this->set('_serialize', ['salesOrder']); 
} 

Salesorders Vorlage edit.ctp

echo $this->Form->input('order_number'); 
echo $this->Form->input('products.0.id', [ 
    'type' => 'select', 
    'options' => $products 
]); 
echo $this->Form->input('products.0._joinData.qty'); 

Die Salesorder Einheit sieht wie folgt aus, wenn Sie das Formular abschicken um die Menge von 5 bis 2.

object(App\Model\Entity\SalesOrder) { 

    'id' => (int) 1, 
    'order_number' => 'SO1111', 
    'products' => [ 
     (int) 0 => object(App\Model\Entity\Product) { 

      'id' => '1', 
      'name' => 'Acme Widget 1', 
      '_joinData' => object(App\Model\Entity\LineItem) { 

       'id' => (int) 1, 
       'product_id' => (int) 1, 
       'sales_order_id' => (int) 1, 
       'qty' => (int) 2, 
       '[new]' => false, 
       '[accessible]' => [ 
        '*' => true 
       ], 
       '[dirty]' => [ 
        'qty' => true 
       ], 
       '[original]' => [ 
        'qty' => (int) 5 
       ], 
       '[virtual]' => [], 
       '[errors]' => [], 
       '[invalid]' => [], 
       '[repository]' => 'LineItems' 

      }, 
      '[new]' => false, 
      '[accessible]' => [ 
       '*' => true, 
       '_joinData' => true 
      ], 
      '[dirty]' => [ 
       '_joinData' => true 
      ], 
      '[original]' => [ 
       '_joinData' => object(App\Model\Entity\LineItem) { 

        'id' => (int) 1, 
        'product_id' => (int) 1, 
        'sales_order_id' => (int) 1, 
        'qty' => (int) 2, 
        '[new]' => false, 
        '[accessible]' => [ 
         '*' => true 
        ], 
        '[dirty]' => [ 
         'qty' => true 
        ], 
        '[original]' => [ 
         'qty' => (int) 5 
        ], 
        '[virtual]' => [], 
        '[errors]' => [], 
        '[invalid]' => [], 
        '[repository]' => 'LineItems' 

       } 
      ], 
      '[virtual]' => [], 
      '[errors]' => [], 
      '[invalid]' => [], 
      '[repository]' => 'Products' 

     } 
    ], 
    '[new]' => false, 
    '[accessible]' => [ 
     '*' => true 
    ], 
    '[dirty]' => [], 
    '[original]' => [], 
    '[virtual]' => [], 
    '[errors]' => [], 
    '[invalid]' => [], 
    '[repository]' => 'SalesOrders' 

} 

zu ändern, wie Sie die schmutzige Eigenschaft auf das sehen SalesOrder ist leer. Es wird nicht angezeigt, dass die Produkte _joinData geändert wurden.

Wenn ich hinzufügen $ salesOrders-> dreckig ('Produkte', wahr); kurz bevor save() aufgerufen wird, wird die Join-Tabelle aktualisiert. Während das funktioniert, und ich könnte etwas Logik schreiben, um das Update auf diese Weise zu behandeln, denke ich, es gibt bessere/richtige Weise, dies zu tun.

Jede Hilfe wird geschätzt, danke im Voraus.

Antwort

0

Es stellte sich heraus, dass dies ein Kuchen Bug in 3.3 war, der bis zur Version 3.3.2 nicht gelöst wurde. Sobald ich aktualisiert habe, hat alles wie erwartet funktioniert. github.com/cakephp/cakephp/pull/9276