Актуализирайте само едно поле на Cakephp 3

В част от приложението ми трябва да актуализирам само полето is_active на някои table с много полета. Какъв е най-добрият подход за актуализиране само на това поле и избягване на валидациите и изискванията на всички други полета?


person Daniel Faria    schedule 13.05.2015    source източник
comment
Това въпрос, свързан със SQL, или въпрос с PHP код (CakePHP)?   -  person Yasen Zhelev    schedule 13.05.2015
comment
Говоря за cakephp 3   -  person Daniel Faria    schedule 13.05.2015
comment
@YasenZhelev този въпрос е от 2010 г. вероятно cakephp 2 или дори 1   -  person Daniel Faria    schedule 13.05.2015


Отговори (5)


И ако искате да актуализирате само определен ред, използвайте това:

 $users= TableRegistry::get('Users');
 $user = $users->get($id); // Return article with id = $id (primary_key of row which need to get updated)
 $user->is_active = true;
 // $user->email= [email protected]; // other fields if necessary
 if($users->save($user)){
   // saved
 } else {
   // something went wrong
 }

Вижте тук (Актуализиране на данни в CakePHP3).

person Manohar Khadka    schedule 13.11.2016
comment
if($user->save($user)) този ред трябва да се замени с if($users->save($user)) - person Poonam; 22.12.2016
comment
Торта 3 има мръсната функция. Така че освен ако не промените другите полета, те няма да бъдат актуализирани или изпратени в заявката. Така че това ви предпазва от презаписване на колони с пароли случайно. Въпреки това, паролите и подобните полета трябва да имат достъп, зададен на false. - person styks; 21.03.2017
comment
Бих го нарекъл и като $users->save($user, ['associated' => false]), само за да съм сигурен - person aexl; 31.05.2019
comment
Имайте предвид, че това ще задейства всеки beforeSave / afterSave на масата, извършваща запазвания. Ако разчитате на съществуващи стойности и ограничавате избора на поле (за оптимизирани заявки), това няма да работи. - person Coreus; 06.10.2019

Това ще работи:

$users = TableRegistry::get('Users');
$query = $users->query();
$query->update()
    ->set(['is_active' => true])
    ->where(['id' => $id])
    ->execute();

http://book.cakephp.org/3.0/en/orm/query-builder.html#updating-data

person Isaac Askew    schedule 13.05.2015
comment
С този метод как потвърждавате, че е актуализиран и пренасочвате към необходимите местоположения? - person artSir; 17.08.2015
comment
обратните извиквания не се задействат по време на това, така че ако имате нужда от тях, това няма да работи - person dav; 08.05.2016
comment
вярно. @Isaac Askew: FYI, ако имате cakephp преди запазване, тогава той няма да бъде задействан с тази query-›update. - person Invincible; 09.11.2018

Използвайки примера тук: http://book.cakephp.org/3.0/en/orm/database-basics.html#running-update-statements. Изпълнете кода по-долу, за да актуализирате всички записи в таблица table_name_here с нова стойност за колона is_active.

use Cake\Datasource\ConnectionManager;
$connection = ConnectionManager::get('default');
$connection->update('table_name_here', ['is_active' => 'new_value_here']);
person Yasen Zhelev    schedule 13.05.2015

Когато не искате да се задействат обратни извиквания, просто използвайте updateAll()

$table->updateAll(['field' => $newValue], ['id' => $entityId]);
person omid    schedule 25.01.2017

Другите отговори не използват подпори за интернационализация и други модели, обратни извиквания и т.н. Мисля, че това се дължи на конструктора на заявки, той не използва моделите и съответно тяхното поведение, следователно трябва да използвате:

$this->loadModel('Inputs');
$input = $this->Inputs->find()->where(['`key`' => $this->request->data['id']])->first();
$this->Inputs->patchEntity($input, ['prop' => $this->request->data['prop']]);

if ($this->Inputs->save($input)) {
    die(json_encode(true));
} else {
    die(json_encode(false));
}
person Kwaadpepper    schedule 29.05.2015