Data Access Objects (DAO)

ה DAO מספק גישת API כללית למידע המאוחסן בסוגי מסדים שונים (DBMS). כתוצאה מכך, ה DBMS היושב מתחת ניתן לשינוי לאחד אחר ללא צורך בשינוי הקוד המשתמש ב DAO בכדי לגשת למידע.

ה DAO של Yii בנוי על בסיס התוסף של PHP בשם (PDO)](http://php.net/manual/en/book.pdo.php) המספק אפשרויות אחידות לגישה למסדי DBMS נפוצים, כמו MySQL, PostgreSQL. לכן, בכדי להשתמש ב DAO של Yii יש צורך בלהתקין ולהפעיל את התוסף של PDO בשרת, וכמו כן להפעיל את התוספים הספציפים למסד הנתונים בו יהיה שימוש (לדוגמא PDO_MYSQL).

ה DAO של Yii בנוי ברובו על בסיס ארבעת המחלקות הבאות:

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

יצירת התחברות למסד הנתונים

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



הפורמט של ה DSN תלוי בדרייבר של מסד הנתונים ב PDO שמשתמשים בו. בכללי, DSN מכיל את שם הדרייבר ב PDO, לאחריו נקודותיים ( : ), ולאחריו תחביר ההתחברות המדוייק לכל דרייבר. יש לעיין דוקומנטציה למידע מלא. למטה רשימה של DNS נפוצים:

מאחר ו CDbConnection יורשת מהמחלקה CApplicationComponent, ניתן להשתמש בו גם כרכיב. בכדי לעשות זאת, יש להגדיר רכיב בהגדרות האפליקציה בשם db (או כל שם אחר) בצורה הבאה,



לאחר מכן אנו נוכל לגשת לחיבור ה DB בעזרת Yii::app()-»db שכבר הופעלה בצורה אוטומטית. אלה אם כן אנו נגדיר באופן ספציפי את המאפיין CDbConnection::autoConnect ל false. שימוש בגישה זו, ההתחברות הזו ניתנת לשימוש במקומות שונים בקוד.

הרצת שאילתות SQL

לאחר יצירת התחברות למסד הנתונים, ניתן להריץ שאילתות SQL על ידי שימוש ב CDbCommand. ניתן לייצר אובייקט של CDbCommand על ידי קריאה ל ()CDbConnection::createCommand עם השאילתה הבאה:



שאילתת SQL מתבצעת בעזרת CDbCommand באחת מהדרכים הבאות:

תזרק שגיאה במידה והייתה בעיה בהרצת השאילתה.



שליפת תוצאות שאילתה

לאחר שהמתודה ()CDbCommand::query יוצרת את האובייקט של CDbDataReader, ניתן לקבל את השורות מהמידע שהוחזר על ידי קריאה ל ()CDbDataReader::read שוב ושוב. ניתן גם להשתמש ב CDbDataReader בתוך לולאה foreach של PHP בכדי לקבל שורה אחרי שורה.



» Note|הערה: בניגוד ל ()query, כל המתודות של queryXXX מחזירות מידע בצורה ישירה. לדוגמא, ()queryRow מחזירה מערך המייצג את השורה הראשונה של תוצאת השאילתה.

שימוש בטרנזקציות

כשאפליקציה מריצה כמה שאילתות, כל אחת קוראת ו/או כותבת מידע למסד הנתונים, חשוב לדעת ולהיות בטוחים שהמסד נתונים מבצע ומריץ את כל השאילתות ולא מפספס אף אחת. טרנזקציה, המיוצגת כאובייקט של CDbTransaction ב Yii , ניתנת לשימוש במקרה כזה:

רצף העבודה המוצג למעלה ניתן ליישום בעזרת הקוד הבא:



תיחום פרמטרים

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

המקומות השמורים לפרמטרים יכולים להיות מוגדרים עם שם יחודי (מאופיינים כמילות מפתח יחודיות) או ללא שם (מאופיינים בעזרת סימני שאלה). יש לקרוא ל ()CDbCommand::bindParam או ()CDbCommand::bindValue בכדי להחליף את הפרמטר עם הערך שהוגדר לו. אין צורך לעטוף את הפרמטרים בעזרת מרכאות: מסד הנתונים בו אתה משתמש יעשה זאת אוטומטית. יש לתחום את הפרמטרים לפני קריאה למתודה המבצעת את השאילתה.



המתודות ()bindParam ו ()bindValue הם דומות מאוד. ההבדל היחידי היא שהראשון תוחם פרמטר בעזרת משתנה ב PHP והשני תוחם פרמטר בעזרת ערך. עבור פרמטרים המייצגים בלוקים גדולים של מידע, הראשון הוא עדיף מבחינת ביצועים.

למידע נוסף אודות תיחום פרמטרים, יש לקרוא בדוקומנטציה של PHP.

תיחום עמודות

בזמן שליפת תוצאות השאילתה, ניתן לתחום עמודות בעזרת משתנים ב PHP כדי שהם יאוכלסו אוטומטית עם הנתונים האחרונים בכל פעם ששורה חדשה נשלפה ממסד הנתונים בעזרת השאילתה, וניתן יהיה לגשת אליהם.



שימוש בקידומת לטבלאות

החל מגרסא 1.1.0, Yii מאפשרת תמיכה מובנית לשימוש בקידומת לטבלאות במסד הנתונים. משמעות הקידומת הינה סטרינג אשר מחובר לתחילת שמות הטבלאות במסד בו כרגע משתמשים. בדרך כלל משתמשים באפשרות זו בשרתים שיתופיים אשר מריצים כמה אפליקציות על אותו המסד ומשתמשים בקידומת שונה לטבלאות לכל אפליקציה כדי להבדיל ביניהם. לדוגמא, אפליקציה אחת יכולה להשתמש בקידומת _tbl בזמן שאפליקציה נוספת תשתמש בקידומת _yii.

בכדי להשתמש בקידומת לטבלאות, יש להגדיר את המאפיין CDbConnection::tablePrefix עם הקידומת הרצויה לשימוש. לאחר מכן, בשאילתות ה SQL יש להשתמש ב {{שם הטבלה}} בכדי להתייחס לשמות הטבלאות, כש שם הטבלה מתייחס לשם הטבלה במסד ללא הקידומת. לדוגמא, אם המסד נתונים מכיל טבלה בשם tbl_user כש _tbl מוגדר כקידומת לטבלאות, אז נוכל להשתמש בקוד הבא בכדי לשלוף נתונים מהטבלה הזו:



«div class="revision"»$Id: database.dao.txt 1764 2010-02-01 00:09:12Z qiang.xue $«/div»