Nette\Database – Smazání řádku v M:N tabulce

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Seith
Člen | 24
+
0
-

Jde takto nějak smazat záznam v tabulce, která vytváří M:N relaci? Uvedená ukázka mi hází PDOException: No reference found for $table1_table2->. Přijde mi to jako bug.

foreach ($activeRow->related('table1_table2') as $table1_table2) {
	$table1_table2->delete();
}
vvoody
Člen | 910
+
0
-

Selection ma tiez metodu delete, takze na volanie related mozes naviazat volanie delete. No s tou chybou nepomozem, treba uviest aspon dump db.

Seith
Člen | 24
+
0
-

Skvělé, netušil jsem, že selection má také metodu delete. K tomu příkladu dump DB:

CREATE TABLE `table1` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8_czech_ci NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;

CREATE TABLE `table2` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8_czech_ci NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;

CREATE TABLE `table1_table2` (
  `table1_id` int(10) unsigned NOT NULL,
  `table2_id` int(10) unsigned NOT NULL,
  PRIMARY KEY (`table1_id`,`table2_id`),
  KEY `table2_id` (`table2_id`),
  CONSTRAINT `table1_table2_ibfk_1` FOREIGN KEY (`table1_id`) REFERENCES `table1` (`id`),
  CONSTRAINT `table1_table2_ibfk_2` FOREIGN KEY (`table2_id`) REFERENCES `table2` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;
vvoody
Člen | 910
+
0
-

Skusil som to a nevybehla ziadna chyba.

INSERT INTO `table1` (`id`, `name`) VALUES (1,	'abc');
INSERT INTO `table1_table2` (`table1_id`, `table2_id`) VALUES (1,	1);
INSERT INTO `table2` (`id`, `name`) VALUES (1,	'xyz');
dump($this->connection->table('table1')->where('name','abc')->fetch()->related('table1_table2')->delete());
Seith
Člen | 24
+
0
-

Ano, to funguje, to nepopírám, avšak co nefunguje a dle mého by mělo, je:

dump(
	$this->connection
	->table('table1')
	->where('name','abc')
	->fetch()
	->related('table1_table2')
	->fetch()
	->delete()
);
vvoody
Člen | 910
+
0
-

Aha, uz som na to prisiel. V ladenke si mozes vsimnut ze tuna vracia $this->table->getPrimary() hodnotu NULL. V tej vazobnej tabulke som zadefinoval PK ako samostatne pole id (namiesto tej dvojice stlpcov) a uz to vsetko funguje. Ale neviem ti povedat ci to je vlastnost alebo bug.

Seith
Člen | 24
+
0
-

Bug to nebude, avšak z principu vazebních tabulek by měli být kombinace klíčů unikátní, je dobré je definovat jako primary key. Můj problém je vyřešen, pouze mě zajímal důvod nefunkčnosti, díky.

Tomáš Jablonický
Člen | 115
+
0
-

Ve vazební tabulce chybí podle mě primární ID … nejsem si jist ale možná podle toho \Nette\Database maže záznamy.

Seith
Člen | 24
+
0
-

Primáční klíč tam je, na dvou sloupcích. Nette\Database s ním pouze neumí pracovat.

Tomáš Jablonický
Člen | 115
+
0
-

Seith napsal(a):

Primáční klíč tam je, na dvou sloupcích. Nette\Database s ním pouze neumí pracovat.

Ano, je tam dvojce sekundárních klíčů (unikátní dvojce) a je to zároveň primární klíč. Nette\Database nejspíš opravdu pracovat. Mám pocit, že opravdu maže záznamy podle ID v tabulce bez rozdílu jestli je to vazemní tabulka nebo tabulka (prostě vazební tabulku nerozpozná i když by mohlo podle tabulka1_tabulka2 ale to by asi byla zbytečná režije).

hrach
Člen | 1838
+
0
-

Jediny a zasadni problem, ktery by resil tento problem je proste podpora pro vicesloupcovy primarni klic.