Доброе время суток.
Я плохо разбираюсь в бд, но понимаю, что все данные лучше передать за один запрос, чем гонять ее из-за каждой новой строки. Делаю я меню на основе статистики посещаемости страниц сайта, используя API яндекс метрики, сохраняю данные о количестве просмотров в бд. Получаю я json сразу всех данных. Подскажите, как правильно организовать сохранение их в бд. Пока что сделал построчное сохранение, но думаю, что это не очень грамотно, так что не ругайтесь.
public function actionIndex()
{
// Получение json из API Яндекса
$dataProvider=new CActiveDataProvider('Statistic');
$today = date("Ymd");
$since = time();
$since = $since - 172800;
$since = date("Ymd", $since);
$metrika_url = "http://api-metrika.yandex.ru/stat/content/popular.json?date1=$since&date2=$today&id=********&pretty=1&per_page=20&reverse=1&oauth_token=********";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $metrika_url);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
$metrika = curl_exec ($ch);
curl_close ($ch);
$metrika = json_decode($metrika);
// Сохранение данных в БД
for($i=0; $i < count($metrika->data); $i++){
$id = $metrika->data[$i]->url;
$id = substr($id,23);
if(is_numeric($id)){
$model = $this->loadModel($id);
$model->count_views = $metrika->data[$i]->page_views;
$model->save();
}
else {
continue;
}
}
$this->render('index',array(
'dataProvider'=>$dataProvider,
));
}
public function loadModel($id)
{
$model=Statistic::model()->findByPk($id);
if($model===null)
throw new CHttpException(404,'The requested page does not exist.');
return $model;
}
Вот пример получаемых данных
[data] => Array
(
[0] => stdClass Object
(
[page_views] => 152
[exit] => 20
[url] =>
test.ru
[id] => 76422421722242948292
[entrance] => 17
)
[1] => stdClass Object
(
[page_views] => 37
[exit] => 0
[url] =>
test.ru/page/62
[id] => 28851019514143479240
[entrance] => 1
)
[2] => stdClass Object
(
[page_views] => 37
[exit] => 1
[url] =>
test.ru/page/61
[id] => 31982420509639932555
[entrance] => 0
)