【问题标题】:Update only one field on Cakephp 3在 Cakephp 3 上只更新一个字段
【发布时间】:2015-05-13 14:53:47
【问题描述】:

在我的应用程序的某些部分,我只需要使用很多字段更新一些 table 的字段 is_active。仅更新此字段并避免所有其他字段的验证和要求的最佳方法是什么?

【问题讨论】:

  • 这是 SQL 相关问题还是 PHP 代码 (CakePHP) 问题?
  • 我说的是 cakephp 3
  • @YasenZhelev 这个问题来自 2010 年。可能 cakephp 2 甚至 1

标签: php cakephp-3.0


【解决方案1】:

如果您只想更新特定行,请使用:

 $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= abc@gmail.com; // other fields if necessary
 if($users->save($user)){
   // saved
 } else {
   // something went wrong
 }

请看这里 (Updating data in CakePHP3)。

【讨论】:

  • if($user->save($user)) 此行应替换为 if($users->save($user))
  • Cake 3 有脏功能。因此,除非您修改其他字段,否则它们不会在查询中更新或发送。因此,这可以防止您意外覆盖密码列。但是,密码和类似字段无论如何都应该设置为 false。
  • 我也称它为$users->save($user, ['associated' => false]),只是为了确定
  • 请记住,这将在执行保存的表上触发任何“beforeSave / afterSave”。如果您依赖于现有值并且您正在限制字段选择(用于优化查询),这将不起作用。
【解决方案2】:

当您不想触发回调时,只需使用 updateAll()

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

【讨论】:

    【解决方案3】:

    这将起作用:

    $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

    【讨论】:

    • 使用此方法如何确认已更新并重定向到必要的位置?
    • 在此期间不会触发回调,因此如果您需要它们,这将不起作用
    • 真的。 @Isaac Askew:仅供参考,如果您在保存前有 cakephp,则此查询不会触发它->更新。
    【解决方案4】:

    使用此处的示例: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']);
    

    【讨论】:

      【解决方案5】:

      其他答案不使用国际化和其他模型道具、回调等。 我认为这是因为查询生成器,它不使用模型及其行为,因此您应该使用:

      $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));
      }
      

      【讨论】:

        【解决方案6】:

        我在将项目从 2.10 升级到 3.x 时遇到了这个问题。

        在 2.10 中,您可以使用以下方法更新单个字段:

        $this->Menus->saveField('css', $menucss);
        

        但由于此方法已被弃用,我们现在如下所示,考虑到不会触发回调:

        $this->Menus->updateAll(['css' => $menucss], ['id' => $menu_id]);
        

        【讨论】:

          猜你喜欢
          • 2018-05-25
          • 2013-07-27
          • 1970-01-01
          • 2014-05-06
          • 2021-11-17
          • 2013-01-22
          • 1970-01-01
          • 2020-04-22
          • 1970-01-01
          相关资源
          最近更新 更多