ublaboo/datagrid – dve hodnoty z jine tabulky v jednom sloupci

papirek
Člen | 8
+
0
-

Ahoj,
prosim poradite nekdo, je to urcite hloupost, ale uz nevim co zkusit…
potrebuji v contribute/datagrid udelat sloupec, ktery obsahuje jmeno a prijmeni z jine (napojene cizim klicem) tabulky

$grid->addColumnText('obchodnik', 'Obchodník', 'users.name:user_id');

myslel jsem, ze bych to udelal pres setRender(), takto:

$grid->addColumnText('obchodnik', 'Obchodník', 'users.name:user_id')
    ->setRenderer(function($item) {
        return $item->name.' '.$item->surname;
    });

ale to mi haze chybu: Cannot read an undeclared column ‚name‘.
data taham z tabulky orders, kde mam sloupec user_id a nastaveny cizi klic na tabulku users, kde jsou sloupce name a surname, ktere potrebuji zobrazit v jednom sloupci v tabulce…

$grid->setDataSource($this->explorer->table('orders'));
Kamil Valenta
Člen | 758
+
0
-

Ten sloupec v orders by měl být users_id, nebo ponechat jméno sloupce a přejmenovat tabulku na user.
A pak stačí jen „users.name“. A druhý sloupec „users.surname“. Trochu problém je, že to má být jeden column, protože setRenderer neovlivní JOIN. Takže je potřeba v Datasource v té selectioně v ->select() explicitně říct, co vše bude potřeba. Ale dost často se pak člověk zamotá, když nad sloupci potřebuje filtry.

Spolehlivé je:

  1. pokud není obchodníků mnoho, tak si je vytáhnout samostatně jako [id ⇒ jmeno+prijmeni] a použít je v setReplacement

nebo

  1. v datasource použít pohled a tam si to joinout dle potřeby…

Editoval Kamil Valenta (25. 10. 2022 20:13)

Marek Bartoš
Nette Blogger | 1165
+
0
-

Tyhle automatický datasources jsou hrozný zlo v okamžiku, kdy člověk chce něco jen trochu komplikovanýho… a k tomu je datasource roztahaný po celém souboru a staticky analyzovatelný.

Šel bych cestou implementace vlastního IDataSource a zredukoval jej na callback, který přijme filter, limit a sort a vrátí data. Něco jako má nextras/datagrid

Editoval Marek Bartoš (25. 10. 2022 20:28)

turbo80
Člen | 50
+
0
-

papirek napsal(a):

Ahoj,
prosim poradite nekdo, je to urcite hloupost, ale uz nevim co zkusit…
potrebuji v contribute/datagrid udelat sloupec, ktery obsahuje jmeno a prijmeni z jine (napojene cizim klicem) tabulky

$grid->addColumnText('obchodnik', 'Obchodník', 'users.name:user_id');

myslel jsem, ze bych to udelal pres setRender(), takto:

$grid->addColumnText('obchodnik', 'Obchodník', 'users.name:user_id')
    ->setRenderer(function($item) {
        return $item->name.' '.$item->surname;
    });

ale to mi haze chybu: Cannot read an undeclared column ‚name‘.
data taham z tabulky orders, kde mam sloupec user_id a nastaveny cizi klic na tabulku users, kde jsou sloupce name a surname, ktere potrebuji zobrazit v jednom sloupci v tabulce…

$grid->setDataSource($this->explorer->table('orders'));

Resil bych to na strane Modelu

<?php
->select('CONCAT(name," ",username) AS obchodnik')

# a takhle v datagridu
$grid->addColumnText('obchodnik', 'Obchodník');
?>