Cannot read an undeclared column ‚title‘

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

Čau, snažím se vypsat data ale dostávám error Cannot read an undeclared column 'title'.
Kód:

		$posts = $this->database->table('posts')
			->order('created_at DESC');
		$postsData = [];

		foreach ($posts as $post) {
		$postsDataItem = new \stdClass();
		$postsDataItem->post = $post;


		$comment = $this->database->table('comments')
			->where('post_id', $post->id)
			->count();
		$postsDataItem->countComments = $comment;

			$postsData[]= $postsDataItem;
		}

		$this->template->postsData = $postsData;

A v latte volám

 {foreach $postsData as $postData}
{$postData->post->title}
{/foreach}

Děkuji za rady.

Editoval mi85 (14. 12. 2016 18:34)

jarda256
Člen | 130
+
0
-

Udělej si dump($postsData) v presenteru a uvidíš jestli se ti to správně zapisuje do array

mi85
Člen | 41
+
0
-

Dump

array (1)
0 => stdClass #7482
post => Nette\Database\Table\ActiveRow #cb56
table private => Nette\Database\Table\Selection #01d0 { ... }
data private => array (1) [ ... ]
dataRefreshed private => FALSE
countComments => 0

Tzn. že se mi to nezapisuje do array pokud se nepletu,kde by mohla být chyba?Když si dumpuju data před vložením do array fungují.Díky

Když si dumpuju ($postDataItem->post) tak se mi vrací

Nette\Database\Table\ActiveRow #c710
table private => Nette\Database\Table\Selection #cda7
data private => array (1)
id => 7
dataRefreshed private => FALSE

Editoval mi85 (14. 12. 2016 18:43)

jarda256
Člen | 130
+
0
-

Já teda používám doctrine ale myslím si že když bys použil {$postData->data->title} tak by to mohlo fungovat. Musím teď pryč tak nemám bohužel čas se nad tím zamýšlet. Kdyžtak ještě večer kouknu

mi85
Člen | 41
+
0
-

Tracy vrací Undefined property: stdClass::$data nicméně díky za pomoc.

Editoval mi85 (14. 12. 2016 18:48)

jarda256
Člen | 130
+
0
-

Proč vlastně dáváš stdClass? Tohle by nešlo? Nejsem žádný expert co se týká nette, tak to prosím ber s rezervou.

$posts = $this->database->table('posts')
    ->order('created_at DESC');
$postsData = [];

foreach ($posts as $post) {

$comment = $this->database->table('comments')
    ->where('post_id', $post->id)
    ->count();
$post->countComments = $comment;
}

$this->template->postsData = $posts;
{foreach $postsData as $post}
{$post->title}
{/foreach}

Editoval jarda256 (14. 12. 2016 18:53)

mi85
Člen | 41
+
0
-

Potřebuji to mít jako objekt.

jarda256
Člen | 130
+
0
-

A mít tam rovnou join s countem komentů?

mi85
Člen | 41
+
0
-

Ano, to ale i po odkomentování nemění nic.

Editoval mi85 (14. 12. 2016 19:00)

jarda256
Člen | 130
+
0
-

Čekal bych tam nějaký ->join(‚comments‘) a v selectu ->select(‚posts,COUNT(comments.id)‘) Nebo tak něco. ale bohužel s nette database nedělám, tak nevím. Zkus kouknout po joinování countu popřípadě řešení před ->query()

mi85
Člen | 41
+
0
-

Díky, ale jak píšu tak count() na tom nic nemění, i když jej odkomentuju tak se nic nezmění.

Editoval mi85 (14. 12. 2016 19:56)

Mysteria
Člen | 797
+
+1
-

Nefunguje ti to proto, že Nette používá cache a vybírá z databáze jenom ty sloupce, které se použijí. Ty nepoužiješ žádné, takže se vybere jenom IDčko a proto máš pak v šabloně jenom IDčka. Takže buď doplníš dotaz o ->select(‚sloupce, které, chceš, vybrat‘) nebo to nepřeváděj na pole stdClass, ale předej si do šablony rovnou $posts a pracuj s tím normálně:

{foreach $posts as $post}
	{$post->title}
	{$post->related('comments')->count('*')}
{/foreach}

Plus ještě technická, místo ->count() používej radši ->count(' * ') , protože to první funguje tak, že vybere všechny data z databáze a počítá záznamy v PHP, kdežto to druhé, udělá klasický COUNT(*) v databázi.

Ondris
Člen | 37
+
0
-

zkus na konec dotazu přidat ->fetchAll() .