В какой-то части моего приложения мне нужно обновить только поле is_active
некоторых table
с большим количеством полей. Каков наилучший подход к обновлению только этого поля и избеганию проверок и требований всех других полей?
Обновите только одно поле в Cakephp 3
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
if($user->save($user))
эту строку следует заменить на if($users->save($user))
- person Poonam; 22.12.2016
Торт 3 имеет грязную особенность. Поэтому, если вы не измените другие поля, они не будут обновлены или отправлены в запросе. Так что это убережет вас от случайной перезаписи столбцов пароля. Тем не менее, для паролей и подобных полей доступ должен быть установлен в false в любом случае.
- person styks; 21.03.2017
Я бы также назвал это
$users->save($user, ['associated' => false])
, просто чтобы быть уверенным
- person aexl; 31.05.2019
Имейте в виду, что это приведет к срабатыванию любого сохранения перед сохранением / после сохранения на столе. Если вы полагаетесь на существующие значения и ограничиваете выбор полей (для оптимизированных запросов), это не сработает.
- 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
С помощью этого метода, как вы подтверждаете, что он был обновлен и перенаправляется в нужные места?
- person artSir; 17.08.2015
обратные вызовы при этом не запускаются, поэтому, если они вам нужны, это не сработает.
- person dav; 08.05.2016
истинный. @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