2015-08-30 27 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"])); 
}