Spojení dvou tabulek při použití multilang

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

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
+
0
-

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
+
0
-

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
+
0
-

zkus neco jako

$item->menu->related('menu', 'parentId') as $child

(ten parametr parentId mozna ani nebude nutny)

kleinpetr
Člen | 480
+
0
-

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)

norbe
Backer | 405
+
0
-

Jak jsem psal, nemůže ti fungovat {$menu->menulang->title} protože v menu nemáš odkaz na menulang, ale naopak, proto je potřeba to řešit přes related. Zkus si schválně ještě jednou projít dokumentaci.

kleinpetr
Člen | 480
+
0
-

Já vím, že to je tím že tam není FK ale je opačně.. ale přeci mi neříkejte že tento easy požadavek není schopné nette zpracovat…

Vždyť zas tolik nechci ne :)

kleinpetr
Člen | 480
+
0
-

‚Nutné řešit přes related‘

tím myslíš to jak jsi uváděl jako první ?

<li>{$item->related('menulang')->where('lang_id' => 1)->fetch()->title}</li>
kleinpetr
Člen | 480
+
0
-

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)