使用 ThinkPHP 視圖模型(ViewModel)進行關聯查詢時,若出現 ERR: 1146: Table 'db.pr_order_view' doesn't exist,通常是**模型類別檔案命名錯誤**導致框架未正確識別為視圖模型,進而嘗試查詢不存在的資料表。
// 錯誤命名:OrderView.class.php(缺少 Model 後綴)
class OrderViewModel extends ViewModel { ... }
框架依據檔案名稱判斷模型類型,OrderView.class.php 會被視為普通模型,產生 SELECT ... FROM pr_order_view SQL,導致資料表不存在錯誤。
遵循 *Model.class.php 命名慣例,框架才會正確載入為視圖模型,自動產生 JOIN 查詢 SQL 而非查詢單表。
class OrderViewModel extends ViewModel {
public $viewFields = array(
'Order' => array(
'_as' => 'Orders',
'id' => 'oid', 'ordid', 'user', 'product', 'status', 'paynum', 'cat',
'payment_trade_no', 'ip' => 'mip', 'reserve_time', 'createtime', 'payment_trade_status',
),
'Member' => array(
'id' => 'mid', 'name' => 'uname', 'cardnum', 'tel', 'reg_time', 'reg_ip',
'qq', 'email', 'address', 'last_login_time', 'last_login_ip',
'_on' => 'Orders.user=Member.id'
),
'Product' => array(
'id', 'shorttitle', 'img1', 'category',
'_on' => 'Orders.product=Product.id'
),
);
}
Model 後綴(最常見)。ViewModel 卻定義 $viewFields。D('Admin/OrderView') 參數錯誤。嚴格遵循 ThinkPHP 模型命名慣例,可避免 90% 的視圖模型「資料表不存在」誤報錯誤。