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


How to fill classes with data from database

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

有很多不同的方法可以做到这一点。阅读有关ActiveRecord或Repository模式的信息。就个人而言,我更喜欢将持久性问题排除在业务层之外,所以我倾向于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();
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;

此外,作为一种最佳实践,你应该始终只用英语命名你的方法和类。

首先,您需要构建适合您需求的正确sql表,我认为您已经这样做了。在这种情况下,您可能至少有两个表:blogPosts&authors,其中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方法它将接收到的数据转换为php关联数组,也称为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"]));
}

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