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.