Модели
Это набор классов, который обеспечивает работу с базой данных.
Для тестирования и проверки реализовано три технологии работы с базой данных:
- Doctrine(DBAL)
vendor/doctrine
- Doctrine(ORM)
vendor/doctrine
- PHP ActiveRecord
library/AR
Рассмотрим основные возможности этих технологий на основе создания нового сообщения (поста).
Для работы с базами данных создан набор классов в папке app/Models/
доступ к которым
обеспечивается провайдером app/Providers/ModelsServiceProvider.php
с помощью метода load
.
public function load($modelName, $modelMethod = null, $data = array()) {
if (isset($this->app["models.{$modelName}"])) {
$Model = $this->app["models.{$modelName}"];
} else {
$modelClass = "\\Models\\{$modelName}Model";
$Model = new $modelClass();
$Model->setApp($this->app);
$this->app["models.{$modelName}"] = $Model;
}
return $Model->$modelMethod($data);
}
В нашем случае мы будем использовать класс модели PostModel app/Models/PostModel.php
для
работы с таблицей post
в базе данных app/Resources/db/app.db
.
Пример такого обращения к модели можно видеть здесь.
// Create new post
$models->load('Post', 'newPost', array('username' => $username, 'new_post' => $ormPost));
Doctrine(DBAL)
Пример добавления записи в таблицу post
с помощью метода newPost
класса PostModel
app/Models/PostModel.php
можно видеть здесь.
/**
* newPost
* Add post for current user
*
* @param array $data
* @return void
*/
public function newPost($data) {
$db = $this->app['db'];
//--------------------
$username = $data['username'];
$ormPost = $data['new_post'];
// Transform the date to format 'Y-m-d'
$date = new \DateTime($ormPost->getCreated());
$ormPost->setCreated($date->format('Y-m-d'));
$arrPost = $ormPost->getValues();
// Get user's id
$sql = "SELECT * FROM user WHERE username = ?";
$user = $db->fetchAssoc($sql, array($username));
if ($user === FALSE) {
$this->app->abort(404, "Not find user for this username \"{$username}\"");
}
$arrPost['user_id'] = $user['id'];
$db->insert('post', $arrPost);
}
Здесь переменная $ormPost
является объектом данных класса Post app/Models/ORM/Post.php
,
который создан на основе Doctrine(DBAL) технологии.
Примеры объектов данных для работы с таблицами базы данных app/Resources/db/app.db
можно посмотреть здесь app/Models/DBAL/
.
Примеры работы с базой данных с помощью консольных команд можно посмотреть здесь app/Cosole/Commands/DBAL/
.
Doctrine(ORM)
Пример получения всех сообщений (постов) для пользователя из таблицы post
с помощью метода getPostsForUser
класса PostModel
app/Models/PostModel.php
можно видеть здесь.
/**
* getPostsForUser
* Get posts for user
*
* @param string $userName
* @return array
*/
public function getPostsForUser($userName) {
$em = $this->app['em'];
$repo = $em->getRepository('Models\ORM\User');
//--------------------
$user = $repo->findOneByUsername($userName);
if ($user === NULL) {
$this->app->abort(404, "Not find user for this username \"{$userName}\"");
}
$posts = $user->getPosts();
// Data for user's posts
$data = array('username' => $user->getUsername(), 'posts' => $posts->toArray());
return $data;
}
Примеры объектов данных для работы с таблицами базы данных app/Resources/db/app.db
можно помотреть здесь app/Models/ORM/
.
Примеры работы с базой данных с помощью консольных команд можно посмотреть здесь app/Cosole/Commands/ORM/
.
PHP ActiveRecord
Пример получения всех сообщений (постов) из таблицы post
с помощью метода postsAction
класса TestController
app/Controllers/TestController.php
можно видеть здесь.
/**
* Action - test/posts
* receive posts written by the user
*
* @param string $userName
* @param int $page
* @return string
*/
public function postsAction($userName, $page) {
$app = $this->app;
$db = $this->app['ar'];
//--------------------
try {
...
// Get posts
if ($userName) {
...
} else {
$posts = array();
// Get user's posts
$users = $db->find('user', 'all', array('select' => 'id, username'));
foreach ($users as $user) {
$posts[$user->username] = $user->post;
}
// Data for user's posts
$data = array('posts' => $posts);
}
return $this->showView($data);
} catch (\Exception $exc) {
return $this->showError($exc);
}
}
Доступ к работе с этим примером возможен в меню Testing/PHP ActiveRecord/User posts, если вы зайдете в приложение как Admin.
Примеры объектов данных для работами с таблицами базы данных app/Resources/db/app.db
можно помотреть здесь app/Models/AR/
.