如何使用数据库中的数据填充类

时间:2015-08-30 13:33:32

标签: php oop pdo

我在我的例子中创建了两个类。这些类分别代表 {Author} {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方法中编写查询吗?

4 个答案:

答案 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;

此外,作为最佳做法,您应始终仅使用英语为您的方法和课程命名。

答案 1 :(得分:1)

有很多不同的方法可以做到这一点。阅读有关ActiveRecord或存储库模式的信息。 Personnaly,我更喜欢将持久性问题留在业务层之外,所以我倾向于存储库模式。

存储库通常由您选择的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();

答案 2 :(得分:1)

首先,您需要构建适合您需求的正确sql表,我假设您已经这样做了。 在这种情况下,您可能至少有2个表:blogPosts&amp;作者,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

第三,您需要使用其中一种获取方法获取该数据,例如fetch(PDO :: FETCH_ASSOC)PDO fetch method 它将收到的数据转换为php关联数组a.k.a Dictionary(Swift,Python等等),然后像这样迭代它:

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。这些小事可能会在以后造成重大错误。

哦,还有一件事,因为你的对象有直接连接(紧耦合),我建议删除公共setter,而不是从构造函数的参数初始化。像这样:

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"]));
}

答案 3 :(得分:0)

要从我的数据库中获取数据,请编写sql查询,然后使用mysql_query或PDO,因为您知道如何建立连接