NDBT – spojenie tabuliek bez cudzieho kľúča
- jurajvt
- Člen | 18
Sedím nad tým už dlho, ale bez pomoci sa ďalej asi nepohnem.
Je možné spojiť tabuľky pomocou stĺpcov, ktoré nie sú viazané cudzím kľúčom?
Aplikácia je už napísaná, ťažko je meniť štruktúru databázy kvôli jednému prípadu.
Takto je to v MySQL:
...
LEFT JOIN advice AS a ON o.id = a.order_id
LEFT JOIN station AS s ON s.car_number = a.car_number
...
A takto by to asi malo byť cez NDBT:
$wagons = $this->orders->findAll()
->select('order.id, order.code, :advice.amount, :advice.car_number,
:advice.station(car_number).car_number')
->where('order.finished <>', 1)
Výsledkom je:
No reference found for $advice->station
Editoval jurajvt (25. 3. 2016 9:29)
- CZechBoY
- Člen | 3608
Tak to můžeš
- udělat fork ndbt a přidat si tam join přes jakýkoliv sloupec
- udělat datasource pro nette\database query v grido
- předat array
- použít jiný datagrid, viz https://forum.nette.org/…boo-datagrid
Editoval CZechBoY (25. 3. 2016 13:56)
- Eda
- Backer | 220
A nestačilo by si jen přepsat DiscoveredConventions (pro příslušnou tabulku si předefinovat chování dvou metod z IConventions) a to si potom předat do Contextu? Nebo se pletu?
Forkování mi přijde jako kanón na vrabce :-)
Editoval Eda (27. 3. 2016 20:54)
- jurajvt
- Člen | 18
Neviem. Vždy hľadám nejaké čisté riešenie a až tak veľmi sa v best practices zatiaľ nevyznám. Vymenil som nakoniec grid, tá myšlienka s PHP-SQL-Parser je v ublaboo/datagrid naozaj dobrá.
Ale, ak by som chcel spraviť to, čo navrhuješ:
Vyrobím vlastné conventions (možno len cez override, alebo úplne nové) a nastavím ich v konštruktore repozitára príslušnej tabuľky pre Context?
public function __construct(IConventions $myConventions) {
parent::__construct();
$this->database->conventions = $myConventions;
}
Ja viem, nepatrí to tu, ale už keď si to načal… Je to takto prijateľné?
- Eda
- Backer | 220
Myslel jsem to tak, že bys do config.neon uvedl něco jako:
database:
default:
dsn: ...
user: ...
password: ...
conventions: Nazev\Moji\Prepsane\Tridy
Tím by snad mělo dojít k tomu, že se přepíše defaultní služba pro konvence a využije se tvá třída.
Ta pak díky autowiringu bude předána i kontextu (jako třetí parametr konstruktoru) a o nic dalšího se nemusíš starat, tedy ani upravovat tvé Repository.