我已经交了一个Yii应用程序来维护和扩展,我正处于熟悉的过程中,主要是Yii,因为我之前没有使用它。
该应用程序在很大程度上使用MySQL视图,许多模型基于它们而不是表格。
我无法弄清楚的是,Yii在执行各种操作之前在何时/何时调用ALTER VIEW语句以填充数据?
以下是一个例子:
MySQL VIEW:
DELIMITER $$
ALTER ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `my_db`.`vw_last30daysorders` AS
SELECT
`d`.`OrderID` AS `OrderID`,
COUNT(`d`.`PropertyID`) AS `cntprops`,
`m`.`RequestID` AS `RequestID`
FROM (`my_db`.`orders_d` `d`
JOIN `my_db`.`orders_m` `m`)
WHERE ((`d`.`OrderID` = `m`.`OrderID`)
AND (`m`.`OrderDate` BETWEEN(CURDATE() - INTERVAL 30 DAY)
AND CURDATE()))
GROUP BY `d`.`OrderID`$$
DELIMITER ;
和Yii Model类:
class VWLast30DaysOrders extends CActiveRecord
{
public static function model($className=__CLASS__)
{
return parent::model($className);
}
public function tableName()
{
return 'vw_last30daysorders';
}
public function rules()
{
return array(
array('requestid', 'required'),
array('requestid', 'numerical', 'integerOnly'=>true),
array('totreqs', 'length', 'max'=>21),
array('totreqsprops', 'length', 'max'=>42),
array('requestid, totreqs, totreqsprops', 'safe', 'on'=>'search'),
);
}
public function relations()
{
return array();
}
public function attributeLabels()
{
return array(
'requestid' => 'Requestid',
'totreqs' => 'Totreqs',
'totreqsprops' => 'Totreqsprops',
);
}
public function search()
{
$criteria=new CDbCriteria;
$criteria->compare('requestid',$this->requestid);
$criteria->compare('totreqs',$this->totreqs,true);
$criteria->compare('totreqsprops',$this->totreqsprops,true);
return new CActiveDataProvider($this, array('criteria'=>$criteria));
}
}
我已经检查了数据库中是否有可能向视图添加数据但未找到任何数据的触发器。
答案 0 :(得分:0)
Yii没有调用alter view语句。
在Yii中使用视图是使用复杂模型关系的捷径。您的视图模型实际上是只读的。
当您实例化模型类时,Yii将使用' SHOW FULL COLUMNS FROM ....来查询数据库。返回列信息的语句,然后填充ActiveQuery对象。
你在Yii中使用你的VWLast30DaysOrders模型,就像任何其他数据模型一样,只是它是只读的。
对于Yii2,您将使用如下代码:
$orders = VWLast30DaysOrders::find()->where(...)
你的模型有点误导,因为rules()函数与模型的其余部分或视图不匹配,因此应该更新(如果需要验证)或清除,如果不是。 / p>