Yii - 何时调用 MySQL CREATE VIEW?
Yii - When is MySQL CREATE VIEW invoked?
我已经得到了一个 Yii 应用程序来维护和扩展,我正在熟悉过程中,主要是使用 Yii,因为我以前没有使用过它。
该应用程序在相当大的范围内使用 MySQL 视图,许多模型都基于它们而不是表格。
我想不通的是,where/when Yii 是否调用 ALTER VIEW 语句以便在执行各种操作之前填充数据?
这是一个例子:
MySQL 视图:
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 模型 class:
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));
}
}
我已经检查了数据库中可能正在向视图添加数据但未找到任何触发器的触发器。
Yii 不调用 alter view 语句。
在 Yii 中使用视图是使用复杂模型关系的捷径。您的视图模型实际上是只读的。
当您实例化模型时 class Yii 将使用 'SHOW FULL COLUMNS FROM ....' 语句查询数据库,其中 returns 然后填充 ActiveQuery 对象的列信息。
您在 Yii 中使用 VWLast30DaysOrders 模型与任何其他数据模型非常相似,只是它是只读的。
对于 Yii2,您将使用如下代码:
$orders = VWLast30DaysOrders::find()->where(...)
您的模型有点误导,因为 rules() 函数与模型的其余部分或视图不匹配,因此应该更新(如果需要进行验证)或清除,如果不需要.
我已经得到了一个 Yii 应用程序来维护和扩展,我正在熟悉过程中,主要是使用 Yii,因为我以前没有使用过它。
该应用程序在相当大的范围内使用 MySQL 视图,许多模型都基于它们而不是表格。
我想不通的是,where/when Yii 是否调用 ALTER VIEW 语句以便在执行各种操作之前填充数据?
这是一个例子:
MySQL 视图:
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 模型 class:
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));
}
}
我已经检查了数据库中可能正在向视图添加数据但未找到任何触发器的触发器。
Yii 不调用 alter view 语句。
在 Yii 中使用视图是使用复杂模型关系的捷径。您的视图模型实际上是只读的。
当您实例化模型时 class Yii 将使用 'SHOW FULL COLUMNS FROM ....' 语句查询数据库,其中 returns 然后填充 ActiveQuery 对象的列信息。
您在 Yii 中使用 VWLast30DaysOrders 模型与任何其他数据模型非常相似,只是它是只读的。
对于 Yii2,您将使用如下代码:
$orders = VWLast30DaysOrders::find()->where(...)
您的模型有点误导,因为 rules() 函数与模型的其余部分或视图不匹配,因此应该更新(如果需要进行验证)或清除,如果不需要.