سرفصل‌های آموزشی
آموزش RESTful API
ساخت مُدل Article

ساخت مُدل Article

در این فصل از دورهٔ آموزش 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$ ورودی، ریسورس مد نظر را از دیتابیس حذف کند.

online-support-icon