Nette Database: Vazba 1:N a řazení s ‚podmínkou‘ (do gridu)
- Ajax
- Člen | 59
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
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
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?