2015-08-30 26 views
2

我在我的例子中創建了兩個類。這些類分別代表{作者}{BlogPost}。我知道如何從這些類中獲取和寫入信息。我的問題是關於處理來自數據庫的信息。如何用數據庫中的數據填充類

屬性是否必須從數據庫類中獲取數據?問題是我不知道如何填充數據庫中的數據。與數據庫的連接不是問題。這是關於我可以用我的數據庫中的數據填充課程的方式。

<?php 

class Author{ 

    private $naam; 
    private $biografie; 
    private $avatar; 

public function getNaam() { 
    print($this->naam); 
} 

public function getBiografie() { 
    print($this->biografie); 
} 

public function getAvatar() { 
    print($this->avatar); 
} 

public function setNaam($naam) { 
    $this->naam = $naam; 
} 

public function setBiografie($biografie) { 
    $this->biografie = $biografie; 
} 

public function setAvatar($avatar) { 
    $this->avatar = $avatar; 
} 

} 

class BlogPost{ 

    private $titel; 
    private $content; 
    private $author; 

public function __construct() { 
    $this->author = new Author; 
} 

public function getTitel() { 
    print($this->titel); 
} 

public function getContent() { 
    print($this->content); 
} 

public function getAuthor() { 
    print($this->author->getNaam()); 
} 

public function setTitel($titel) { 
    $this->titel = $titel; 
} 

public function setContent($content) { 
    $this->content = $content; 
} 

} 

?> 

我知道如何編寫查詢到從我的數據庫中的數據,但我不知道該理線在我班上的數據。

我必須將我的屬性鏈接到數據庫嗎?

private $naam = Database::getName(); 

還是我需要在我的get或set方法中編寫查詢?

+0

我們展示您使用從數據庫獲取數據的代碼。 – RiggsFolly

回答

1

有很多不同的方法來做到這一點。閱讀ActiveRecord或Repository模式。 Personnaly,我寧願將持久性問題留在業務層之外,所以我傾向於Repository模式。

存儲庫通常由您選擇的ORM提供支持,但仍可以使用普通SQL實現存儲庫。但是,請記住,如果不使用工具,則必須執行自己的髒檢查以確定對象的哪些部分在保存時發生了更改。

僞對儲存:

public class AuthorSqlRepository implements AuthorRepository { 
    private QueryService queryService; 

    public AuthorSqlRepository(QueryService queryService) { 
     this.queryService = queryService; 
    } 

    public void save(Author author) {} 

    public Author findById(String authorId) { 
     resultset = queryService.executeQuery('SELECT id, naam, bio, avatar FROM Author WHERE ...'); 

     author = new Author(); 

     //In languages that supports it, reflection can be used 
     //to set private class members directly so that you do not need 
     //public setters. 
     author.setId(resultset.id); 
     ... 
     return author; 
    } 
} 

然後,你可以這樣做:

所有的
authorRepository = new AuthorSqlRepository(queryService); 
author = authorRepository.findById(someAuthorId); 
naam = author.getNaam(); 
0

要想從我的數據庫中的數據編寫SQL語句,然後使用的mysql_query或PDO你知道如何建立一個連接

+0

感謝您的回覆。我知道如何通過編寫查詢從我的數據庫中獲取數據,但我不知道如何處理我班的數據。 我必須將我的屬性鏈接到數據庫嗎? private $ naam = Database :: getName(); 或者我需要在我的get或set方法中編寫查詢嗎? – Lycaon

+0

先寫入查詢,取數據然後在類裏面處理它們 –

1
private naam = Database::getName(); 

你可以在Java中這樣的事情,但不是在PHP。如果你這樣做,PHP會拋出一個致命的錯誤,指出無效的語法。

您只能在類方法內通過函數調用的結果填充類屬性。例如:

class Author 
{ 
    public $name; 

    public function load() 
    { 
     $this->name = DB::getName(); 
    } 
} 

$author = new Author(); 
$author->load(); 
echo $author->name; 

另外,作爲一種最佳實踐,您應該始終只用英語爲您的方法和類命名。

+0

謝謝。對不起,在我的參數中使用荷蘭語代替英文。 它適用於我,但我想知道您的示例是否是一種可接受且優雅的方式來執行此操作? – Lycaon

+0

@Lycaon這幾乎都屬於ActiveRecord類別,但還有其他方法可以做到這一點。我更喜歡Repository模式。 – plalx

+0

@Lycaon我不喜歡這種方法是你的對象可能在任何時候都處於無效狀態。如果load()未被調用,那麼類成員沒有正確初始化。我強烈建議您使用始終有效的實體,而不是將對象用作啞數據容器。 – plalx

1

首先,你需要建立一個適合您的需求,我認爲你做已經是正確的SQL表。 在這種情況下,您可能至少有兩個表:blogPosts &作者,其中blogPosts.author用於通過它的id加入作者。

第二步你需要從DB請求需要的數據,通過這些表之間的INNER JOIN,它可以用很多方式寫入。例如,如果你使用PDO,你可以這樣做:

$db = new PDO("mysql:host=your_host;dbname=your_db_name","your_user_name", "your_password"); 


$query=$db->query("SELECT a.naam, a.biografie, a.avatar, bp.title, bp.content, bp.author 
        FROM authors AS a, blogposts AS bp 
        WHERE a.id=bp.author");//Executes an SQL statement, returning a result set as a PDOStatement object 

第三,你需要的獲取方法之一來獲取這些數據,例如取(PDO :: FETCH_ASSOC)PDO fetch method 將接收到的數據轉換成PHP關聯數組也就是字典(斯威夫特,巨蟒等...),並遍歷它像這樣:

while($r=$query->fetch(PDO::FETCH_ASSOC)){ 
//$r["naam"] for author's naam column 
//$r["title"] for blogPosts's title 
$bPost=new BlogPost(); 
$bPost->setTitle($r["title"]); 
//... 

} 

由於@DavidY前面提到的,類型的所有名稱,方法,屬性等。應該寫成用英語寫,並且應該有意義,並且還要注意,在BlogPost類中,你寫了titel而不是title。那些小事情會在稍後造成很大的錯誤。

哦,還有一件事,因爲你的對象有直接的連接(緊密耦合),我會建議刪除公用制定者,和而不是從構造函數中的參數進行初始化。就像這樣:

class BlogPost{ 
    private $title; 
    private $content; 
    private $author; 
    public function __construct($title,$content,$author){ 
     $this->title=$title; 
     $this->content=$content; 
     $this->author=$author; 
    } 
} 
class Author{ 
    private $naam; 
    private $biografie; 
    private $avatar; 
    public function __construct($naam,$biografie,$avatar){ 
     $this->naam=$naam; 
     $this->biografie=$biografie; 
     $this->avatar=$avatar; 
    } 
} 

然後,你的循環體變成一條線

while($r=$query->fetch(PDO::FETCH_ASSOC)){ 
    $bPost=new BlogPost($r["title"],$r["content"],new Author($r["naam"],$r["biografie"],$r["avatar"])); 
}