Задать вопрос

Как сохранить несколько строк данных в mysql за одно обращение к бд ( Yii )?

Доброе время суток.
Я плохо разбираюсь в бд, но понимаю, что все данные лучше передать за один запрос, чем гонять ее из-за каждой новой строки. Делаю я меню на основе статистики посещаемости страниц сайта, используя 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
)
  • Вопрос задан
  • 3084 просмотра
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 3
@melnikov_m
$connect = Yii::app()->db;
$connectBuilder = $connect->schema->commandBuilder;
$attributes - массив с данными.
$connectBuilder->createMultipleInsertCommand('table', $attributes)->execute();

www.yiiframework.com/doc/api/1.1/CDbCommandBuilder...
Ответ написан
@Arik
Надо получить такой запрос:
INSERT INTO tbl_name (col1,col2) VALUES ($val1_1, $val1_2), ($val2_1, $val2_2), ...,($valN_1, $valN_2);

А цикл хотя бы так делать, если через foreach не получается/не нравится
// Сохранение данных в БД
for($a = 0, $b = count($metrika->data); $a < $b; $a++){
// ....
}
Ответ написан
ArtemSV
@ArtemSV
Пытаюсь выучить php/mysql/Yii2
Насколько я понимаю необходимо обновить только одно поле, это можно реализовать одним запросом sql.
Что-то вроде:
$query = "UPDATE `table_name` SET `count_views` = CASE";
$counter = 0;
if(is_numeric($id)){
    $query .=" WHEN `id` = ".$id." THEN '".$metrika->data[$i]->page_views."' ";
    $counter++;
} 
if ($counter) {
    $query .="  ELSE `count_views` END ;"
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
23 дек. 2024, в 09:41
5000 руб./за проект
23 дек. 2024, в 09:39
1000000 руб./за проект
23 дек. 2024, в 09:33
3000 руб./за проект