Nette Database: Vazba 1:N a řazení s ‚podmínkou‘ (do gridu)

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

Ahoj!

Řeším takovou věc.. Potřebuju v Ublaboo gridu s Nette Database řadit podle připojené tabulky 1:N. Což by nebyl problém,ale to řazení je tak nějak s podmínkou. Mám schéma:

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


CREATE TABLE `contact_items` (
	`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
	`contacts_id` int(10) unsigned NOT NULL,
	`item_name` varchar(16) COLLATE utf8_czech_ci NOT NULL,
	`item_value` varchar(64) COLLATE utf8_czech_ci NOT NULL,
	PRIMARY KEY (`id`),
	KEY `INDEX` (`contacts_id`),
	CONSTRAINT `contact_items_ibfk_1` FOREIGN KEY (`contacts_id`) REFERENCES `contacts` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;

V contact_items jsou uloženy uživatelem definované položky kontaktu, jako email, url, fax, ICQ číslo,… Takže něco jako

INSERT INTO `contact_items` (`contacts_id`, `item_name`, `item_value`) VALUES
(2,	'cell',	'+420721123465'),
(2,	'email', 'abc@def.cz'),
(2,	'wifi-pass', 'supertajneheslo'),
(5,	'cell',	'+420777123456'),
(9,	'cell',	'+420777123456'),
(9,	'cell',	'+42077888888'),
(9,	'email', 'aa@bb.cz'),
(10,'cell',	'+420737123456'),
(10,'moje poznamka', 'Haha'),
(11,'ICQ',	'123456789')

Mno a já teď v Ublaboo gridu potřebuju řadit podle e-mailu, nebo podle telefonního čísla. Takže něco jako „seřaď tabulku contacts podle contact_items.item_value ale jen pokud contacts_item.item.name == email“

Víte někdo jak to udělat v NDTB? Děkuju moc…

Aleš

Editoval Ajax (31. 10. 2016 10:02)

CZechBoY
Člen | 3608
+
0
-

Zkus něco takovýho

$grid->addColumnText('email')
	->setSortable()
	->setSortableCallback(function($datasource, $sort) {
		$dir = strtoupper(reset($sort));
		if (in_array($dir, ['ASC', 'DESC'], true) === false) {
			throw new InvalidArgumentException('Dir "' . $dir . '" is not allowed.');
		}

		$datasource
			->where('item_name = ?', 'email')
			->order('item_value ' . $dir);
	});

Editoval CZechBoY (31. 10. 2016 9:49)

Ajax
Člen | 59
+
0
-

Nojo, to mě taky napadlo, ale to mě vytáhne jen kontakty, které mají item_name = 'email'. Já potřebuju všechny kontakty, ale řazení podle e-mailu…

CZechBoY
Člen | 3608
+
0
-

No a podle čeho chceš řadit když kontakt nemá email?

Ajax
Člen | 59
+
0
-

Některé kontakty ho mají, některé ne. V gridu se zobrazí prázdné pole, pokud ho nemá a pokud podle toho seřadím, tak při ASC budou napřed prázdná pole a pak podle abecedy. Takhle na sucho to vypadá divně, ale třeba při použití filtru to už dává smysl. Třeba vyfiltruju si všechny ‚aleše‘ a pak je seřadím podle emailu. A někteří ho mají, někteří ne, v čem vidíš problém?