2011-12-14 64 views
1

我有兩個類:

用戶學說2.1 - 一對多的關係,數據下載

/** @Entity @Table(name="users") */ 
class User { 
    /** 
    * @Id @GeneratedValue @Column(type="integer") 
    * @var integer 
    */ 
    protected $id; 

    /** 
    * @Column(type="string", length=20, unique=TRUE) 
    * @var string 
    */ 
    protected $login; 

    /** 
    * @OneToMany(targetEntity="News", mappedBy="author") 
    */ 
    protected $news;  

    public function __construct() { 
     $this->news = new \Doctrine\Common\Collections\ArrayCollection; 
    } 
} 

新聞

/** @Entity @Table(name="news") */ 
class News { 
    /** 
    * @Id @GeneratedValue @Column(type="integer") 
    * @var integer 
    */ 
    protected $id; 

    /** 
    * @Column(type="string", length=100) 
    * @var string 
    */ 
    protected $title; 

    /** 
    * @Column(type="text") 
    * @var string 
    */ 
    protected $content; 

    /** 
    * @ManyToOne(targetEntity="User", inversedBy="news") 
    * @JoinColumn(referencedColumnName="id") 
    */ 
    protected $author; 
} 

當我將這個代碼

$q = $this->db->createQuery('SELECT u FROM User u WHERE u.id = '.$id); 
$user = $q->getSingleResult(); 

該教義是否會從數據庫下載所有消息(由特定用戶創建)?

回答

1

直到您通過調用新聞存取方法來請求用戶的新聞時纔會發生。如果你重寫查詢作爲

SELECT u, n FROM User u JOIN u.news n 

然後,用戶和他的新聞將全部作爲結果返回。在查詢u.id = '.$id避免SQL注入:

您還可以檢查使用記錄器通過理論生成的查詢:

$config->setSQLLogger(new Doctrine\DBAL\Logging\EchoSQLLogger); 

PS:從來沒有做到這一點。相反,使用佔位符:

$q = $this->db->createQuery('SELECT u FROM User u WHERE u.id = :id'); 
$q->setParameter('id', $id); 
+0

感謝您的意見:)。下一個問題。只有當我使用`$ user-> getNews()`方法時,用戶的新聞纔會從數據庫下載。 – 2011-12-15 19:19:15