Nette\Database spojení tabulek + agregační dotazy
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- hiny
- Člen | 35
Zdravím,
snažím se toto přepsat a doplnit o práci s další tabulkou(hodnocení
článku), ale prozatím neůspěšně.
<?php
public function getArticlesByCategory($category_id)
{
return $this->connection->table('article')
->select('*')
->where('category_id=?', $category_id);
}
?>
Prozatím mám složený dotaz,
<?php
public function getArticlesByCategory($category_id)
{
return $this->connection->query("
SELECT
article.*,
AVG(articlerating.value) AS rating,
COUNT(articlerating.id) AS ratings
FROM articlerating
RIGHT JOIN article
ON articlerating.article_id = article.id
WHERE article.category_id = $category_id
GROUP BY article.id,
articlerating.article_id;");
}
?>
kterým docílím potřebného výběru dat, nicméně dále se používá
limit() a count() v paginátoru a skončím s hlášením
Call to undefined method Nette\Database\Statement::count()
respektive pokud přepíšu
<?php
$vpaginator->itemCount = $articles->count();
?>
na
<?php
$vpaginator->itemCount = count($articles);
?>
Call to undefined method Nette\Database\Statement::limit()
Najde se někdo, kdo poradí jak na to?
Editoval hiny (11. 7. 2013 17:17)
- hiny
- Člen | 35
Tak jsem to vyřešil(metoda pokus omyl funguje :-) ).
public function getArticlesByCategory($category_id)
{
return $this->connection->table('article')
->select('article.*, AVG(articlerating:value) AS rating, COUNT(articlerating:id) AS ratings')
->where('article.category_id = '.$category_id)
->group('article.id, articlerating:article_id');
}
Výsledný dotaz:
SELECT `article`.*, AVG(`articlerating`.`value`) AS `rating`, COUNT(`articlerating`.`id`) AS `ratings`
FROM `article`
LEFT JOIN `articlerating` ON `article`.`id` = `articlerating`.`article_id`
WHERE (`article`.`category_id` = 1)
GROUP BY `article`.`id`, `articlerating`.`article_id`
Editoval hiny (11. 7. 2013 22:02)