2014-09-12 40 views
0

我是PHP編程和Symfony的新手。英語不是我的母語很抱歉,如果這聽起來很奇怪我怎麼寫......在模型中放置數據庫查詢的位置? (Symfony框架)

我有兩個實體:文章類別,其中每篇文章都有一個類別。我需要證明我多少文章有一個給定的類別:

類別 ------------------

車輛 - ------------------- 4

電子---------------- 20

食品--- -------------------- 15

傢俱------------------ 8

隨着學說我做了兩個實體的CRUD文件。

php app/console doctrine:generate:crud 

就像我說的,問題是,我想說明一個類別(名稱,說明等)以及有多少文章屬性表的它是在清單中。

的SQL查詢很簡單:

SELECT count(*) FROM Articles a WHERE a.id_category = $id_category 

放在哪裏是?我很困惑,不想制定最佳實踐規則。 Doctrine生成大量文件:ArticleController.php,ArticleType.php(Form),以及所有.twig的視圖。類別相同。

+0

順便說一句,沒有必要爲你的英語道歉,這比我見過的許多母語寫作者都要好。 – 2014-09-12 14:45:37

+0

IMO開始使用Symfony2進行編碼而沒有仔細閱讀所有文檔(並且沒有PHP和OOP的一點知識,或者沒有像Java或C這樣的面向對象的其他語言)是一種非常糟糕的方法(一般情況下)和浪費時間,因爲在某些時候,您必須按照正確的步驟從頭開始......這意味着開始閱讀文檔。 – 2014-09-12 17:19:40

回答

2

在精神直接回答你的問題:你需要的是custom Doctrine Repository,在這種情況下是ArticleRepository

例如 ArticleRepository.php

namespace ACME\DemoBundle\Article; 

use Doctrine\ORM\EntityRepository; 

class ArticleRepository extends EntityRepository 
{ 
    public function countForCategory($id) 
    { 
     $result= $this->createQueryBuilder('a') 
      ->join('a.category', 'c') 
      ->where('c.category_id = :id') 
      ->setParameter('id', $id) 
      ->select('count(a') 
      ->getQuery() 
      ->getSingleScalarResult(); 

     return $result; 
    } 
} 

然後設置你的文章實體使用ArticleRepository

Article.php

/** 
* @ORM\Entity 
* @ORM\Table(name="article") 
* @ORM\Entity(repositoryClass="ACME\DemoBundle\Entity\ArticleRepository") 
*/ 
class Article 
{ 
/// etc... 

然後,您可以得到存儲庫的實體例如您的控制器(儘管如其他地方所建議的,您可以將其隱藏在某種服務中,以避免爲控制器填充業務邏輯;只需要從控制器內部以某種方式獲得),然後運行查詢:

ArticleController

class ArticleController extends Controller 
{ 
    public function countAction($id) 
    { 

     $articleRepo = $this->getDoctrine()->getRepository('DemoBundle:Article'); 

     $count = $articleRepo->countForCategory(); 
     //etc... 

NB如果你真的想在你的例子完全輸出,它可能是更有效地爲整個表做一個查詢,可能是在一個CategoryRepository,進行計數和分類分組。該查詢將返回一個包含類別名稱和計數的數組。

0

在您的服務層創建一個CategoryManager類,並處理那裏的任何業務邏輯。您可以通過依賴注入將路由器傳遞給它。

對於您的示例,CategoryManager將有一個getUrl(Article $ article)方法,它將使用路由器實例(您通過__construct注入或通過單獨的setter方法注入)基於$ article的屬性生成Url,並且把它返還。

此方法將確保您的業務邏輯不污染視圖或控制器層。

檢查此鏈接Services Symfony

+0

感謝您的回答,但我認爲這有點出於我的知識。我不熟悉那個服務層。從來沒有想過它會如此複雜。也許這樣一個簡單的要求有點矯枉過正? – Bebop 2014-09-12 14:50:29

1

當使用的Symfony2 + Doctrine2,

  1. 不認爲(這麼多)有關數據庫。考慮持久數據對象,所謂的實體,並讓Doctrine處理它們。雖然,花一些時間清楚地定義這些對象之間的關係。

  2. 忘記術語「MVC」。 MVC是一個相當抽象的概念,現實中事情更加複雜。法比安(SF鉛DEV)有一個很好的寫了這個話題:http://fabien.potencier.org/article/49/what-is-symfony2

如果你想知道要放什麼東西在你的Symfony束,閱讀菜譜文章:http://symfony.com/doc/current/cookbook/bundles/best_practices.html

+2

+1但是,讓我們來討論Repository吧,你的答案將會完成:) – DonCallisto 2014-09-12 15:21:38

+0

好的,你想知道什麼?我會在帖子中添加它。 – lxg 2014-09-12 16:05:25

相關問題