本文主要記錄本人從學習yii2到使用yii2開發項目過程中遇到的一些問題以及解決方法和知識點總結。
1. AR類關聯哪個數據表?
默認情況下,AR類會根據類名稱關聯和類名相關的數據表,如:類名為Country時,關聯數據表為country;類名為CountrySearch時,關聯數據表為country_search。如果在數據庫配置中通過“tablePrefix”參數配置了數據表前綴,默認還會加上表前綴。若需要關聯的數據表名稱和AR類名稱不存在這種映射關系,則需要實現tableName()方法返回關聯的數據表名稱,例如,Country類需要關聯country2數據表,可以實現如下:
public static function tableName(){ return '{{%country2}}'; }
其中使用%表示使用數據庫配置的表前綴。
2. 執行AR類load()方法塊賦值之后,執行save()方法插入或更新數據記錄,得到對應記錄的數據字段都為空,或者使用了數據表定義的默認值,沒有定義默認值而且定義了“not null”的字段還會報錯“doesn’t have a default value”?
這種情況下就很糾結了,代碼、數據表看起來都是對的,但結果就是不如人意。其實這與AR類的塊賦值有關。塊賦值的時候,AR類會優先賦值“public”和“protected”屬性的類成員變量,找不到對應成員變量的時候再去賦值關聯數據表中同名的字段。所以,出現這種問題,應該是在AR類中聲明了和該類關聯數據表字段同名的“public”或“protected”成員變量,塊賦值的時候AR類就會把值賦給了成員變量,而數據表的同名字段其實並沒有被賦值。
3. 所有表單邏輯都在AR類實現好,還是創建表單模型來分別處理各個表單比較好?
若所有表單邏輯都在AR類實現,勢必需要定義多個場景來區分,當表單越來越多的時候場景也會越來越多,而且可能每次增加場景之后驗證規則也要做相應調整,若不細心還會影響其他場景,代碼不夠清晰。而且可能有些表單要用到的數據表中沒有的一些屬性還需要定義為AR類的成員變量並添加對應驗證規則,驗證規則會很亂。若一個表單使用一個表單模型來管理的話,會讓代碼變得更清晰,更易於維護,但是表單越來越多的時候表單模型類也會越來越多,不過可以使用不同目錄來存放模型文件。
所以,這兩種方法各有優缺點,但后者更為可取。
4. 本想更新一條數據記錄,結果插入了一條新的記錄?
若想使用模型類的save()或update()方法修改數據表數據,需要先找到對應的記錄再去更新數據,否則更新失敗。因為模型類需要根據模型對象的_oldAttributes屬性去更新對應數據記錄,若該屬性為空則模型會認為需要插入一條新的記錄。
持續更新中...