در این فصل از دورهٔ آموزش RESTful API کدنویسی بخش اصلی پروژه که همان وبلاگ است را آغاز خواهم کرد بدین شکل که پیش از هر چیز نیاز به ساخت مُدلی تحت عنوان Article
خواهیم داشت که این وظیفه را دارد تا کلیهٔ تَسکهای CRUD مرتبط با مقالات وبلاگ را هندل کند. برای همین منظور، داخل پوشهٔ Models
فایلی تحت عنوان Article.php
ساخته و آن را به صورت زیر تکمیل میکنیم:
<?php
namespace Api\Models;
class Article
{
private $connection;
private $articlesTable = 'articles';
public function __construct($database)
{
$this->connection = $database;
}
public function create(array $data)
{
$query = "
INSERT INTO $this->articlesTable
(title, content, user_id, category_id)
VALUES
(:title, :content, :user_id, :category_id);
";
$statement = $this->connection->prepare($query);
return $statement->execute([
'title' => $data['articleTitle'],
'content' => $data['articleContent'],
'user_id' => $data['usrId'],
'category_id' => $data['catId'],
]);
}
public function read()
{
$query = "
SELECT
$this->articlesTable.id,
title,
content,
created_at,
category_name,
first_name as author_first_name,
last_name as author_last_name
FROM
$this->articlesTable
LEFT JOIN categories ON
$this->articlesTable.category_id = categories.id
LEFT JOIN users ON
$this->articlesTable.user_id = users.id;
";
$statement = $this->connection->prepare($query);
$statement->execute();
return $statement;
}
public function readById(int $id)
{
if (is_numeric($id) && $id > 0) {
$query = "
SELECT
$this->articlesTable.id,
title,
content,
created_at,
category_name,
first_name as author_first_name,
last_name as author_last_name
FROM
$this->articlesTable
LEFT JOIN categories ON
$this->articlesTable.category_id = categories.id
LEFT JOIN users ON
$this->articlesTable.user_id = users.id
WHERE
$this->articlesTable.id = ?
";
$statement = $this->connection->prepare($query);
$statement->execute([$id]);
return $statement;
}
}
public function update(int $id, array $data)
{
$query = "
UPDATE $this->articlesTable
SET
title = :title,
content = :content,
user_id = :user_id,
category_id = :category_id
WHERE id = :id;
";
$statement = $this->connection->prepare($query);
return $statement->execute([
'id' => $id,
'title' => $data['articleTitle'],
'content' => $data['articleContent'],
'user_id' => $data['usrId'],
'category_id' => $data['catId']
]);
}
public function delete(int $id)
{
$query = "DELETE FROM $this->articlesTable WHERE id = :id;";
$statement = $this->connection->prepare($query);
return $statement->execute([
'id' => $id,
]);
}
}
در تفسیر این کلاس میتوان گفت که ابتدا به ساکن نِیماِسپیس این فایل را مشخص ساخته سپس داخل بدنهٔ کلاس Article
دو پراپرتی تحت عناوین connection$
و articlesTable$
ساختهایم بدین صورت که پراپرتی اول به محض ساخت یک آبجکت از روی این کلاس در داخل کانستراکتور مقداردهی خواهد شد و پراپرتی دوم نیز دارای مقدار پیشفرض articles
است که به نوعی میتوان گفت نام جدول مربوطه در دیتابیس میباشد.
بررسی متد ()create
حرف اول نام این متد (C) برگرفته از CRUD است بدین صورت که وظیفهٔ ساخت یک ریسورس یا بهتر بگوییم مقالهٔ جدید را دارا است که یک پارامتر ورودی تحت عنوان data$
از جنس آرایه میگیرد. داخل این متد متغیری به نام query$
ساختهایم که حاوی کدهای اسکیوال به منظور درج مقادیر user_id
،content
،title
و category_id
در جدول articles
است.
همانطور که در ارتباط با مُدل User
توضیح دادیم، برای آن که کاربری با نیت سوء نتواند به اِسکمای دیتابیس ما پی ببرد، فیلدهایی که در سمت کلاینت در نظر گرفتهایم مرتبط با فیلدهای جدول articles
اما دقیقاً مشابه آنها نیست.
بررسی متد ()read
حرف اول نام این متد (R) برگرفته از CRUD است که وظیفهٔ فراخوانی کلیهٔ رکوردهای ثبتشده در جدول articles
را بر عهده دارد. همانطور که در محتوای در نظر گرفته شده برای متغیر query$
مشخص است، از آنجا که نیاز به اطلاعاتی همچون نام و نامخانوادگی کاربر + نام دستهبندی مقالات داریم، در این کوئری به دیتابیس دو اصطلاحاً JOIN
به جداول categories
و users
زدهایم.
همچنین در این کوئری از مفهومی تحت عنوان Alias نیز استفاده کردهایم بدین شکل که با استفاده از کیورد as
گفتهایم فیلدِ first_name
و last_name
از جدول users
به ترتیب در نامهای گویاتری همچون author_first_name
و author_last_name
ذخیره گردند.
بررسی متد ()readById
ساختار این متد تا حد بسیار زیادی مشابه متد ()read
است با این تفاوت که یک پارامتر ورودی تحت عنوان id$
از جنس عدد صحیح میگیرد و داخل بدنهٔ این متد دستور دادهایم که فقط در شرایطی کوئری به دیتابیس زده شود که مقدار این متغیر از جنس عدد صحیح بوده و بزرگتر از صفر باشد. همچنین در انتهای کدهای اسکیوال که داخل متغیر query$
درج نمودهایم نیز کیورد WHERE
را نوشته تا رکوردی با شناسهٔ مد نظرمان را فِچ (فراخوانی) کنیم.
بررسی متد ()update
حرف اول نام این متد (U) برگرفته از CRUD است که دو پارامتر ورودی تحت عناوین id$
و data$
میگیرد و این وظیفه را دارا است تا اطلاعات یک مقاله را بر اساس شناسهاش آپدیت کند.
بررسی متد ()delete
حرف اول نام این متد (D) برگرفته از CRUD است و همانطور که از نامش مشخص میباشد، این وظیفه را دارد تا بر اساس id$
ورودی، ریسورس مد نظر را از دیتابیس حذف کند.