Обновите только одно поле в 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
Имейте в виду, что это приведет к срабатыванию любого сохранения перед сохранением / после сохранения на столе. Если вы полагаетесь на существующие значения и ограничиваете выбор полей (для оптимизированных запросов), это не сработает. - 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: К вашему сведению, если у вас есть Cakephp перед сохранением, то он не будет запущен с этим запросом-›обновлением. - 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