Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
У меня есть фильтр
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);
}
}
Так к сожалению не получается, подскажите пожалуйста как решить задачу?
Не в сети
Не в сети
у меня есть БД config откуда данные кэшируются
по идеи если все удачно, то данные полученные в методе store должны попасть в эту бд, а они не попадают( мистическим образом)
Я создал бд config1 и данные туда успешно записывались
По этому даже не знаю что я не так делаю(
Не в сети
И можно еще спросить дабы не плодить лишние темы, в $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 чтобы не плодить запросы к бд а уместить в один запрос?
Не в сети
- а они не попадают( мистическим образом)
Не могу сказать почему, с виду всё нормально. Можно попробовать вместо put в store вызывать forget и посмотреть, повлияет ли это на кэш (он очистится и следующий запрос должен будет его обновить).
- как в моем случае можно оптимизировать update чтобы не плодить запросы к бд а уместить в один запрос?
Судя по коду — никак, т.к. обновляемые данные различаются для обоих условий (запросов).
Не в сети
я не думаю так.
Дело в том что "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 сразу нескольких строк?
Не в сети
Отвечу на свои два вопроса сам
$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);
}
Не в сети
- а вообще есть ли примеры update сразу нескольких строк?
Кому-то нужно подучить SQL INSERT нескольких строк — вполне можно делать, а вот UPDATE — это операция по изменению всех подходящих под WHERE строк указанным в SET образом. Скомбинировать несколько SET и WHERE в один запрос нельзя точно так же как нельзя сделать это с SELECT. Поэтому просто делаются отдельные запросы для каждого обновления.
Не в сети
а вообще есть ли примеры 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.
Не в сети
Страницы 1