Spojení dvou tabulek při použití multilang
- kleinpetr
- Člen | 480
Zdravím :) řeším následující problém..
mám 2 tabulky menu a menulang
menu
id, parentId(FK), active, …menulang
menu_id(FK), title, lang_id, …
Nyní se snažím jednoduše spojit tyto dvě tabulky, ale stále se mi
nedaří.
Když načtu nejprve z tabulky menu
$this->template->menu = $db->getTable('menu')->where(array('active'=>1));
//zatím je vše supr a nyní v šabloně
{foreach $menu as $item}
<li>{$item->menulang->title}</li>
{/foreach}
// skončí errorem
Cannot read an undeclared column ‚menulang‘
a to samé když bych chtěl filtrovat z druhé tabulky např:
$this->template->menu = $db->getTable('menu')->where(array('active'=>1,'menulang.lang_id'=>1));
// také skončí errorem
Když si nejprve načtu tabulku menulang a na ní použiji filtr z tabulky menu tak to funguje i následné Has One funguje, problém ale zase nastává když potřebuji použít ->related().
Má někdo nějakou radu jak toto vyřešit ? Zkrátka jak jednoduše spojit tyto dvě tabulky ?
Editoval kleinpetr (30. 1. 2015 7:06)
- norbe
- Backer | 405
Musíš použít následující:
{foreach $menu as $item}
<li>{$item->related('menulang')->where('lang_id' => 1)->fetch()->title}</li>
{/foreach}
A nebo rovnou vyjdeš z tabulky menulang (což mi přijde lepší, jelikož neprogramuješ v šabloně):
$this->template->menu =$db->getTable('menulang')->where(array('menulang.active'=>1,'menulang.lang_id'=>1, 'menu.active' => 1));
{foreach $menu as $item}
<li>{$item->title}</li>
{/foreach}
- kleinpetr
- Člen | 480
První metoda funguje :)
Ta druhá je jak jsem říkal, pokud použiji pro select nejprve menulang tak je vše super do doby, než volám submenu neboli related zpet do tabulky menu
Presenter:
$this->template->menu =$db->getTable('menulang')->where(array('menulang.active'=>1,'menulang.lang_id'=>1, 'menu.active' => 1));
Template:
{foreach $menu as $item}
<li>$item->title</li>
<ul>
<li n:foreach="$item->related('menu.parentId') as $child"> // v tuhle chvíly nastává opět error
{$child->title}
</li>
</ul>
{/foreach}
Error:
Illegal offset type
Editoval kleinpetr (30. 1. 2015 8:51)
- David Matějka
- Moderator | 6445
zkus neco jako
$item->menu->related('menu', 'parentId') as $child
(ten parametr parentId mozna ani nebude nutny)
- kleinpetr
- Člen | 480
Také jsem už vše zkoušel :D
$item->related('menu','parentId');
// Illegal offset type
$item->related('menu');
// No reference found for $menulang->related(menu).
Takže to prostě nechápu.
Tak změna:
$item->menu->related('menu');
vrací ale prvky sebe samé.. nikoli sub prvky
a při
$item->menu->related('menu','parentId') as $child
{child->title}
//Cannot read an undeclared column 'title'
a kyž výpis zkusím zase takto: {$child->menulang->title}
// Cannot read an undeclared column 'menulang'
ale kyž výpis zkusím takto: {$child->id}
// tak to funguje, jen zkrátka zase čte jen z tabulky menu a ne z menulang
Editoval kleinpetr (30. 1. 2015 12:20)
- kleinpetr
- Člen | 480
Takže finální řešení, které už funguje jen ještě nefunguje multilanguage..
Presenter:
$this->template->menu = $db->getTable('menulang')->where(array('lang_id'=>1,'menu.active'=>1))->order... ;
Template:
<ul>
{foreach $menu as $item}
<li>{$item->title}
//submenu
<ul class="sub">
<li n:foreach="$item->menu->related('menu','parentId')->where('active',1) as $child">
{$child->related(menulang)->fetch()->title}
</li>
</ul>
</li>
{/foreach}
</ul>
// toto už je funkční jen je problém při lang_id
pokud nastavím where pro polozky submenu zde:
<li n:foreach="$item->menu->related('menu','parentId')->where(array('active'=>1,'menulang.lang_id'=>1)) as $child">
{$child->related(menulang)->fetch()->title}
</li>
// error: No reference found $menu->menulang
Když zksuím dát where sem
<li n:foreach="$item->menu->related('menu','parentId')->where('active',1) as $child">
{$child->related(menulang)->where('lang_id',1)->fetch()->title}
</li>
// Tak se stane taková zvláštnost, že pokud je parametr 1, aplikace jede.. ale jakmile zadám jako parametr například lang_id = 2 tak skončí tímto errorem: Trying to get property of non-object
Editoval kleinpetr (30. 1. 2015 18:41)