מדריך Yii 2 – עבודה עם דאטאבייסים

במדריך הזה ניצור עמוד חדש שמציג תוכן של טבלה ב-DB בשם country. כדי לעשות זאת, אנחנו נגדיר את החיבור ל-DB ( כלומר connection), ניצור אוביקט של  Active Record , נגדיר action, וניצור view.

במדריך נעבור על הנושאים הבאים :

  • הגדרת connection אל הדאטאבייס
  • הגדרת אוביקט ActiveRecord
  • איך לבצע שאילתות על אוביקט ActiveRecord
  • איך להציג רשומות , עם חלוקה לעמודים (pagnition)

הנחת היסוד היא שיש לך ידע מסוים בדאטאבייסים, אתה צריך לדעת ליצור DB, להריץ פקודות SQL ולהשתמש באיזשהוא כלי ניהול של DB.

הכנת הדאטאבייס

כדי להתחיל, צור דאטאבייס בשם yii2basic שממנו נמשוך את הנתונים. אתה יכול ליצור אותו ב- SQLite, MySQL, PostgreSQL, MSSQL ,Oracle, לכולם יש תמיכה מובנית ב-Yii.

יחד עם זאת, בשביל הפשטות ההנחה לצורך המדריך הזה היא שאתה משתמש ב-MySql.

שלב שני, הרץ את הפקודות הבאות, שיוצרות טבלה בשם country, ומכניסות לה מספר רשומות.

CREATE TABLE `country` (
  `code` CHAR(2) NOT NULL PRIMARY KEY,
  `name` CHAR(52) NOT NULL,
  `population` INT(11) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `country` VALUES ('AU','Australia',18886000);
INSERT INTO `country` VALUES ('BR','Brazil',170115000);
INSERT INTO `country` VALUES ('CA','Canada',1147000);
INSERT INTO `country` VALUES ('CN','China',1277558000);
INSERT INTO `country` VALUES ('DE','Germany',82164700);
INSERT INTO `country` VALUES ('FR','France',59225700);
INSERT INTO `country` VALUES ('GB','United Kingdom',59623400);
INSERT INTO `country` VALUES ('IN','India',1013662000);
INSERT INTO `country` VALUES ('RU','Russia',146934000);
INSERT INTO `country` VALUES ('US','United States',278357000);

כעת, יש לך כבר דאטאבייס שנקרא yii2basic ובתוכו לפחות טבלה אחת בשם country עם כמה עמודות ו-10 רשומות.

הגדרת החיבור לדאטאבייס (database connection)

לפני שנמשיך, נא וודא ש-php  מותקנת אצלך עם התוספת שנקראת PDO, זוהי דרישת חובה כדי ש-Yii תוכל לתקשר עם דאטבייס רלציוני.

בהנחה ש-PDO מותקנת אצלך, פתח את הקובץ config/db.php ושנה את הפרמטרים הנחוצים כדי ליצור חיבור עם הדאטאבייס על השרת שלך.

<?php
// שנה את מה שצריך כאן
return [
    'class' => 'yiidbConnection',
    'dsn' => 'mysql:host=localhost;dbname=yii2basic',
    'username' => 'root',
    'password' => '',
    'charset' => 'utf8',
];

הקובץ config/db.php הוא כלי הגדרה, שעוזר לאתחל ברקע מופע (instance) של אוביקט  yiidbConnection כדי שיהיה אפשר לתקשר עם הדאטאבייס.

אם אתה צריך לגשת לאוביקט הקונקשיין תוך כדי ריצה, תוכל לעשות זאת בפניה אל  Yii::$app->db.

הערה : הקובץ config/db.php נמשך (include) על ידי הקובץ  config/web.php שמאתחל את האוביקט  application. להרחבה בנושא הגדרות, בקר בקישור  Configurations.

 יצירה של ActiveRecord

כדי לגשת למידע מתוך הטבלה country, עלינו ליצור מחלקת בת של Active Record בשם של הטבלה – Country ולשמור את זה בקובץ models/Country.php.

<?php

namespace appmodels;

use yiidbActiveRecord;

class Country extends ActiveRecord
{
}

המחלקה Country מרחיבה (extends) את המחלקה  yiidbActiveRecord. בעיקרון , אתה לא צריך לרשום כלום בתוך המחלקה, כי Yii "תנחש" את הטבלה המשויכת למודל זה לבד.

הערה : אם אין סיכוי לנחש את השם מתוך שם ה-class, אתה יכול להגדיר את שם הטבלה בעצמך באמצעות המתודה yiidbActiveRecord::tableName().

עכשיו, אחרי שיש לנו מחלקה בשם Country, יהיה קל יותר לגשת למידע ולעשות מניפולציות עליו.

הנה כמה דוגמאות קוד לשליפת נתונים וגישה אליהם :

 

use appmodelsCountry;

// לשלוף את כל הרשומות מהטבלה ולמיין אותן לפי השדה name
$countries = Country::find()->orderBy('name')->all();

// שלוף את כל הרשומות עם מפתח ראשי שהוא US
$country = Country::findOne('US');

// להציג תוכן של שדה
echo $country->name;

// לשנות ערך בשדה ולשמור את השינוי בדאטאבייס
$country->name = 'U.S.A.';
$country->save();

הערה : גישה לנתונים באמצעות ActiveRecord היא דרך מאוד עוצמתית, מונחית עצמים. למידע נוסף בקר בקישור הבא :  Active Record

כדאי לדעת שיש אפשרות לבצע שאילתות בצורה "גולמית" יותר עם אוביקט אחר שנקרא Data Access Objects.

יצירת Action

כדי להציג לגולשים את תוכן הטבלה country, אנחנו צריכים ליצור action חדש. הפעם, במקום ליצור אותו בתוך ה-controller שנקרא site, אנחנו ניצור אותו בתוך controller חדש, שיהיה שייך ספציפית לטבלה הזו, ונקרא לו בשם CountryController, בתוך הקונטרולר החדש, ניצור מתודה/action בשם index כמו שמוצג בקוד הבא :

<?php

namespace appcontrollers;

use yiiwebController;
use yiidataPagination;
use appmodelsCountry;

class CountryController extends Controller
{
    public function actionIndex()
    {
        $query = Country::find();

        $pagination = new Pagination([
            'defaultPageSize' => 5,
            'totalCount' => $query->count(),
        ]);

        $countries = $query->orderBy('name')
            ->offset($pagination->offset)
            ->limit($pagination->limit)
            ->all();

        return $this->render('index', [
            'countries' => $countries,
            'pagination' => $pagination,
        ]);
    }
}

שמור את קטע הקוד הזה בקובץ  controllers/CountryController.php.

מה בעצם קורה בקוד ? המתודה/action שנקראת index קוראת ל Country::find() שזוהי מתודה מובנית לביצוע שאילתות DB , וכך מחזירה מידע מתוך הטבלה country .

כדי להגביל את מספר הרשומות המוצגות על המסך (ארצות במקרה זה) , אנחנו משתמשים באוביקט עימוד – yiidataPagination שמבצע מניפולציה על השאילתא, כך שנחזיר רק חלק מהרשומות – רק כמות מסוימת שנרצה להציג על המסך.

האוביקט הזה –yiidataPagination  יכול לסייע לנו בכמה צורות :

  • הוא מוסיף פסויקיות LIMIT ו-OFFSET למשפט ה-SQL של השאילתא. (במקרה שלנו הגבלנו ל-5 רשומות בכל דף).
  • הוא מאפשר להוסיף ל-view סט  של כפתורים לדילוג בין עמודים (1,2 וכו…)

בסוף הפונקציה index, אנו קוראים ל-render כדי ליצר view שנקרא index ומעבירים אליו את חבילת המידע על country, ביחד עם אוביקט העימוד שיצרנו.

יצירת ה-view

עכשיו, צור תיקיה חדשה תחת תיקית views וקרא לה country. התיקיה הזו תכיל את כל ה-views שקשורים לקונטרולר country. בתוך תיקית views/country צור קובץ חדש וקרא לו index.php ובתוכו הדבק את הקוד הבא :

<?php
use yiihelpersHtml;
use yiiwidgetsLinkPager;
?>
<h1>Countries</h1>
<ul>
<?php foreach ($countries as $country): ?>
    <li>
        <?= Html::encode("{$country->name} ({$country->code})") ?>:
        <?= $country->population ?>
    </li>
<?php endforeach; ?>
</ul>

<?= LinkPager::widget(['pagination' => $pagination]) ?>

ל-view יש 2 חלקים : החלק הראשון מציג את הרשומות מתוך הטבלה country בתור "רשימה" של html.

והחלק השני  יש widget של Yii שנותן את כפתורי מעבר בין עמודים. הוא נקרא yiiwidgetsLinkPager  .

נסה את זה בעצמך

כדי לראות את כל הקוד בפעולה, גלוש אל

http://hostname/index.php?r=country/index

זה צריך להיראות כך :

בראש הדף אתה תראה 5 מדינות, ומתחת להן, יופיעו כפתורי העימוד. אם תקליק על אחד מכפתורי העימוד, תראה כיצד מופיעות רשומות אחרות בהתאמה, ואם תשים לב, תראה שגם הכתובת בדפדפן משתנה בהתאם.

לדוגמא , עבור העמוד השני , הכתובת שתופיע היא :

http://hostname/index.php?r=country/index&page=2

 

מאחורי הקלעים, אוביקט העימוד – Pagination , מספק את כל היכולות הדרושות כדי שזה יקרה :

  • בתחילה, אוביקט Pagination מציג את העמוד הראשון, באמצעות פסוקית SQL  הבאה לסוף המשפט LIMIT 5 OFFSET 0. , כתוצאה מכך נקבל את 5 המדינות הראשונות.
  • רכיב ה-  LinkPager מרנדר את הכפתורים למטה, כשכל כפתור מכיל URL עם פרמטר page לעמוד אחר.
  • כאשר אנו מקליקים על "2" לדוגמא, אז אוביקט ה- Pagination מקבל את הפרמטר, ומוסיף לסוף משפט ה-SQL את הפסוקית LIMIT 5 OFFSET 5 ומחזיר את המדינות הבאות בהתאם.

סיכום – עבודה עם דאטאבייסים ב- Yii 2

במדריך הזה למדת כיצד לעבוד עם דאטאבייס, בנוסף למדת על השימוש באוביקט yiidataPagination , וברכיב ה yiiwidgetsLinkPager .

במדריך הבא נראה איך להשתמש בכלי ה-Gii, כלי עוצמתי של Yii המאפשר לחסוך המון זמן באמצעות כך שהוא בונה עבורך חלקים שלמים באפליקציה – מודלים, CRUD, ועוד.

המדריך מפורסם לפי התנאים של Yii, והמקור נמצא כאן

 

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *