The function that deletes unnecessary items, orders and users lifetime of which has already gone
{
$max_lifetime = Yii::app()->getModule('shoppingcart')->max_lifetime;
$connection = Yii::app()->db;
Yii::beginProfile('garbageCollector');
$ordersToRemove = $command=$connection
->createCommand(
"SELECT ProcessOrder.id AS order_id,
ProcessOrder.user_id,
IF((DATE_ADD(IFNULL(MAX(Item.ordered_at),ProcessOrder.started_at), INTERVAL :max_lifetime MINUTE) < NOW()) , TRUE , FALSE) AS order_to_remove,
IF((COUNT(OrderedOrder.id) < 1) , TRUE, FALSE) AS user_to_remove
FROM {{order}} AS ProcessOrder
LEFT JOIN {{item}} AS Item
ON ProcessOrder.id = Item.order_id
LEFT JOIN {{order}} AS OrderedOrder
ON ProcessOrder.user_id = OrderedOrder.user_id AND OrderedOrder.ordered = :ordered
WHERE ProcessOrder.ordered=:process GROUP BY ProcessOrder.id
HAVING order_to_remove = TRUE")
->bindValues(array(
':max_lifetime' => $max_lifetime,
':ordered' => Order::ORDERED,
':process' => Order::PROCESS
))->queryAll();
$orderIds = array();
$userIds = array();
foreach($ordersToRemove as $order){
$orderIds[] = $order['order_id'];
if($order['user_to_remove']){
$userIds[] = $order['user_id'];
}
}
$orderIds = array_unique($orderIds);
$userIds = array_unique($userIds);
if(count($orderIds)){
$criteria=new CDbCriteria;
$criteria->addInCondition('order_id', $orderIds);
}
if(count($orderIds)){
$criteria=new CDbCriteria;
$criteria->addInCondition('id', $orderIds);
}
if(count($orderIds)){
$criteria=new CDbCriteria;
$criteria->addInCondition('id', $userIds);
}
Yii::endProfile('garbageCollector');
}