2015-08-30 3 views
2

В моем примере я создал два класса. Эти классы представляют соответственно {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?

+0

показать нам код, который используется для получения данных из базы данных. – RiggsFolly

ответ

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(); 
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, но есть и другие способы сделать это. Я предпочитаю шаблон репозитория. – plalx

+0

@ Lycaon Что мне не нравится в этом подходе, так это то, что ваши объекты могут быть оставлены в недопустимом состоянии в любое время. Если load() не вызывается, члены класса неправильно инициализируются. Я настоятельно рекомендую вам иметь всегда действующие объекты, а не использовать объекты как немые контейнеры данных. – plalx

1

Прежде всего, вам нужно построить правильные таблицы SQL, который соответствует вашим потребностям, которые я предполагаю, что вы сделали уже. В этом случае у вас, вероятно, есть как минимум 2 таблицы: blogPosts & авторов, где blogPosts.author используется для присоединения к автору через его идентификатор.

На втором этапе вам необходимо запросить необходимые данные из БД, через 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 ассоциативный массив ака словарь (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 вы написали титл вместо названия. Эти мелочи могут вызвать большие ошибки позже.

О, и еще одна вещь, поскольку объекты имеют прямое соединение (жесткая связь), я предлагаю удалить публичные сеттеры, а вместо этого - инициализировать параметры конструктора. Как это:

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"])); 
} 
Смежные вопросы