如題,想弄清楚一點YII2中的model和activeRecord的具體作用和區別...由於之前用TP的,慣性覺得model用來操作資料庫進行CRUD
回複內容:
如題,想弄清楚一點YII2中的model和activeRecord的具體作用和區別...由於之前用TP的,慣性覺得model用來操作資料庫進行CRUD
一.Model:
models 是mvc中的一部分,是代表業務資料,規則和邏輯的對象.
Model 類也是更多進階模型如Active Record 活動記錄的基類
預設情況下,模型是直接從yii\base\Model繼承。
才疏學淺,我就以我實際開發中遇到的情境來解釋一下。
我舉個實際的例子吧,比如進入系統之前的第一步是登入頁面,要求使用者輸入使用者名稱,密碼。
使用者在輸入使用者名稱和密碼之後,我們會對使用者名稱和密碼進行校正。
則這時候我們需要一個LoginForm模型,它有兩個屬性:username,password。
我們看model代碼:
namespace app\models;use yii\base\Model;class LoginForm extends Model{ public $username; public $password; public function rules() { // 這裡寫你的驗證規則 [['username', 'password'], 'required'], // password is validated by validatePassword() ['password', 'checkPassword'], // 驗證密碼 } // 這裡寫你驗證密碼的邏輯 public function checkPassword($attribute,$params) { // ...... } // 這裡寫登入的邏輯 public function login() { // ...... }}
我們看controller代碼:
namespace app\controllers;use Yii;use yii\web\Controller;class SiteController extends Controller{ // ... public function actionLogin() { $model = new LoginForm(); // 根據使用者在登入表單的輸入來做判斷 if ($model->load(Yii::$app->request->post()) && $model->login()) { return $this->goBack(); } }}
二.AR類
來看看yii手冊上的文字描述:
Active Record (活動記錄,以下簡稱AR)提供了一個物件導向的介面, 用以訪問資料庫中的資料。一個 AR 類關聯一張資料表, 每個 AR 對象對應表中的一行,對象的屬性(即 AR 的特性Attribute)映射到資料行的對應列。 一條活動記錄(AR對象)對應資料表的一行,AR對象的屬性則映射該行的相應列
AR類究竟跟model有什麼關係?我們從代碼上看:
開啟 yii\db\ActiveRecord.php:
class ActiveRecord extends BaseActiveRecord{}
我們發現ActiveRecord繼承BaseActiveRecord,再開啟yii\db\BaseActiveRecord.php:
abstract class BaseActiveRecord extends Model implements ActiveRecordInterface{}
可以看出繼承了Model類.
追蹤一下原始碼吧,會發現它們之間的關係的
ActiveRecord 繼承自 Model 提供資料操作。
ActiveRecord
資料庫的對象映射的一種方法,是把資料庫表映射到程式中對象的一種設計思路。
Model
則是資料模型操作的概括。
ActiveRecord
可以理解為操作資料庫的一種手段(當然還有其他的手段,比如直接的SQL
查詢等等)。而Model
應該理解為我們需要進行那些操作,就把這些操作寫在Model
裡。
大多數架構喜歡將這兩個東西融合在一個對象中,所以理解起來會有一些混淆。其實ActiveRecord
更多使用的是對象的屬性參數(因為要對資料庫映射來的資料進行儲存),而Model
更多的提現在對象的方法上(操作方法也就是具體如何操作資料的流程)。