Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 17.12.2013 20:00:36

[L4] перезапись кэша

У меня есть фильтр

App::before(function($request)
{

    if(!Cache::has('DoncodeConfig')){
        $config = Configs::all();
        Cache::put('DoncodeConfig',$config, 1440);
    }else{
        $config = Cache::get('DoncodeConfig');
    }

    foreach ($config as  $value) {
        Config::set('doncode.'.$value->key, $value->value);
    }
    #
});

Я создал метод контроллера store:

public function store()
    {
$input = Input::all();
        $asterisk_main_context= $input['asterisk_main_context'];
         ...
        $tooltip = $input['tooltip'];

        $validation = Validator::make($input, Configs::$rules);

        if ($validation->passes()) {
            if(Input::has('asterisk_main_context')){
               $this->Configswhere('key','=','asterisk_main_context')->update(array('value' => $asterisk_main_context))->get();
            }

              ...
            if(Input::has('tooltip')) {
                         $this->Configs
                             ->where('key','=','tooltip')
                             ->update(array('value' => $tooltip ));
            }

            
            return Redirect::to('settings');
        }
        else {
            return Redirect::to('settings')->withErrors($validation);
        }
   }

как мне после выполнения store перезаписать кэш?
Побывал так:

 
  // app/controllers/SettingsController.php
public function store()
    {
$input = Input::all();
        $asterisk_main_context= $input['asterisk_main_context'];
         ...
        $tooltip = $input['tooltip'];

        $validation = Validator::make($input, Configs::$rules);

        if ($validation->passes()) {
            if(Input::has('asterisk_main_context')){
               $this->Configswhere('key','=','asterisk_main_context')->update(array('value' => $asterisk_main_context))->get();
            }

              ...
            if(Input::has('tooltip')) {
                         $this->Configs
                             ->where('key','=','tooltip')
                             ->update(array('value' => $tooltip ));
            }

           $config = Configs::all();
           Cache::put('DoncodeConfig',$config, 1440);
            
return Redirect::to('settings');
        }
        else {
            return Redirect::to('settings')->withErrors($validation);
        }
   }

Так к сожалению не получается, подскажите пожалуйста как решить задачу?

Не в сети

#2 18.12.2013 08:41:33

Re: [L4] перезапись кэша

Попробуй в имени для put использовать только нижний регистр. А вообще, как именно «не получается»?

Не в сети

#3 18.12.2013 10:58:37

Re: [L4] перезапись кэша

у меня есть БД config откуда данные кэшируются
по идеи если все удачно, то данные полученные в методе store должны попасть в эту бд, а они не попадают( мистическим образом)

Я создал бд config1 и данные туда успешно записывались
По этому даже не знаю что я не так делаю(

Не в сети

#4 18.12.2013 11:06:28

Re: [L4] перезапись кэша

И можно еще спросить дабы не плодить лишние темы, в $input = Input::all(); у меня храниться массив переменных которых необходимо занести в БД методом update

Я выполняю это так

             if(Input::has('asterisk_main_context')){
               $this->Configs->where('key','=','asterisk_main_context')
               ->update(array('value' => $asterisk_main_context))->get();
            }

              ...
            if(Input::has('tooltip')) {
                         $this->Configs
                             ->where('key','=','tooltip')
                             ->update(array('value' => $tooltip ));
            }


как в моем случае можно оптимизировать update чтобы не плодить запросы к бд а уместить в один запрос?

Не в сети

#5 18.12.2013 11:38:30

Re: [L4] перезапись кэша

  1. а они не попадают( мистическим образом)

Не могу сказать почему, с виду всё нормально. Можно попробовать вместо put в store вызывать forget и посмотреть, повлияет ли это на кэш (он очистится и следующий запрос должен будет его обновить).

  1. как в моем случае можно оптимизировать update чтобы не плодить запросы к бд а уместить в один запрос?

Судя по коду — никак, т.к. обновляемые данные различаются для обоих условий (запросов).

Не в сети

#6 18.12.2013 11:51:54

Re: [L4] перезапись кэша

я не думаю так.
Дело в том что "asterisk_main_context", 'tooltip' и другие переменные я получаю из Input.
Эти переменные по любому будут приходить ко мне, т.к. они завязаны с формой

В документации есть отличный пример с insert-ом

DB::table('users')->insert(array(
    array('email' => 'taylor@example.com', 'votes' => 0),
    array('email' => 'dayle@example.com', 'votes' => 0),
));

я думал также сделать и с методом update

а вообще есть ли примеры update сразу нескольких строк?

Не в сети

#7 27.12.2013 11:53:58

Re: [L4] перезапись кэша

Отвечу на свои два вопроса сам

        $input = Input::all(); 
        $validation = Validator::make($input,Configs::$rules);
        if ($validation->passes()){ 
            foreach($input as $key=>$value){  // здесь мы перебираем массив input на ключ-значение и просто update'им в цикле
            DB::table('config')
             ->where('key', $key)
             ->update(array('value' => $value
                            ));
        }
               Cache::forget('DoncodeConfig'); // чтбы перезаписать кэш, для начала его удалим, а потом снова запишем получившееся данные
               $config = Configs::all();
               Cache::put('DoncodeConfig',$config, 1440);
               
               return Redirect::to('settings')->with('message', 'Данные успешно записаны') ;
              }
              else {
                return Redirect::to('settings')->withErrors($validation);
          }

Не в сети

#8 27.12.2013 13:27:59

Re: [L4] перезапись кэша

  1. а вообще есть ли примеры update сразу нескольких строк?

Кому-то нужно подучить SQL ☺ INSERT нескольких строк — вполне можно делать, а вот UPDATE — это операция по изменению всех подходящих под WHERE строк указанным в SET образом. Скомбинировать несколько SET и WHERE в один запрос нельзя точно так же как нельзя сделать это с SELECT. Поэтому просто делаются отдельные запросы для каждого обновления.

Не в сети

#9 05.01.2014 16:16:00

Artdevue
Откуда: Kiev
Сообщений: 119
Сайт

Re: [L4] перезапись кэша

а вообще есть ли примеры update сразу нескольких строк?

как пример, я делаю так

$affectedRows = User::where('votes', '>', 100)->update(array('status' => 2));

т.е. у всех юзеров у кого votes больше 100, обновит status в 2.


If you think it’s expensive to hire a professional to do the job, wait until you hire an amateur.

Не в сети

Подвал раздела