Database CakePHP是否基于同一行中的其他值更新字段值?

Database CakePHP是否基于同一行中的其他值更新字段值?,database,cakephp,mysql,Database,Cakephp,Mysql,我一直在试图找出如何做到这一点,但似乎这并不是许多人在cakephp中试图做到的事情,或者我完全误解了文档。。我正在使用下面的查询来获取字段值,因此我得到了一个“findbycreated”为0的值。。。这部分很好用 $unregisteredemail = $this->Testmodel->findBycreated('0'); $emailaddress = $unregisteredemail['Testmodel']['emailaddress'] ; $emailpass

我一直在试图找出如何做到这一点,但似乎这并不是许多人在cakephp中试图做到的事情,或者我完全误解了文档。。我正在使用下面的查询来获取字段值,因此我得到了一个“findbycreated”为0的值。。。这部分很好用

$unregisteredemail = $this->Testmodel->findBycreated('0');
$emailaddress = $unregisteredemail['Testmodel']['emailaddress'] ;
$emailpassword = $unregisteredemail['Testmodel']['password'] ;
但是现在,在我对检索到的数据执行一些操作之后,我想将同一行、同一模型/表中的一个字段标记为值“1”,以指示已执行操作(例如,电子邮件地址已成功创建)。。。我只是不知道如何在cakephp中实现这一点,尽管我努力阅读文档并进行搜索,但这应该相当简单,在这一点上,我很想使用一个常规的mysql查询作为一个简单的查询。。基本上,查询是(请原谅我的语法,因为我有一段时间没有使用直接的mysql查询)“更新(数据库/表)集'created'='1',其中'emailaddress'=$emailaddress”

如果需要的话,我也可以使用行ID,因为cakephp似乎更喜欢这样,但仍然不知道如何做到这一点。。以下是我的尝试,但不起作用:

// update database to show that email address has been created
$this->Testmodel->read('emailaddress', $this->Testmodel->findBycreated('0'))
$this->Testmodel->id = 1;
$this->Testmodel->set(array(
            'created' => '1'
            ));

 $this->Testmodel->save();

在这种情况下,我会让Cake处理id,只关注更改行数据并将其重新保存到数据库

$row = $this->Model->findBycreated(0);
$row['Model']['emailaddress'] = 1;
$this->Model->save($row);
这样,您就不必担心id了,因为id无论如何都会在您的数据集中,所以只需更改所需内容,然后告诉Cake保存即可


忍者编辑,请确保从
findBycreated()
方法返回一整行的
id

有很多方法可以完成您的工作。我建议您阅读。除了david的解决方案之外,另一个简单的方法是

$this->Testmodel->id = 1;  
$this->Testmodel->saveField('created' =>'1'); 

从前面的答案可以看出,有几种方法可以达到相同的目的。我只是想解释一下为什么你的方法不管用

在该模型中,CakePHP根据其对的实现将数据库行抽象为一个数组。这为我们提供了一种简便的方法来处理数据,并在MVC体系结构中使用它

当你说:

$this->Testmodel->set(array(
            'created' => '1'
            ));
您直接处理模型,但数据实际上是作为数组存储在名为$data的类变量中的。要访问和操作此数据,您应该说:

$this->data['Testmodel']['created'] => '1';
将模型名称指定为第一个索引的原因是,在检索关联表的地方,可以以相同的方式访问这些表,因此您可能有,例如:

Array([Testmodel] => Array ([id] => 1,
                            [created] => [1],
                            ...
                           )
      [Relatedmodel] => Array ([id] => 1,
                               [data] => asd,
                            ...
                           )
     )
……等等。非常方便

现在,当您在没有参数的情况下使用
$this->
->save()
时,默认情况下,它使用$this->data,并使用与调用save方法的模型相适应的数据数组部分。如果出于某种原因,您不(或不能)使用
$this->data
,您还可以传递一个数据数组,其格式与此相同

您使用的read()方法不正确。第一个参数应为null、字符串或字符串数组(表示字段名)。第二个参数应该是您希望读取的记录的id。相反,对于param 2,您将传递一个find的结果,该结果将是一个数组。您未捕获的结果将为空

我会像这样编写您的代码:

$this->data = $this->Testmodel->read('emailaddress',1); 
$this->data['Testmodel']['created'] = 1;
$this->Testmodel->save();
或者更简洁地说:

$this->Testmodel->id = 1;
$this->Testmodel->saveField('created', 1);

好的,我想我终于找到了解决方案,我能够让它工作:

$this->Test->updateAll(
  array(
    'Test.field' => 'Test.field+100'
  ),
  array(
    'Test.id' => 1
  )
);
我认为您必须使用updateAll,因为其他任何东西都只会创建一个新行。。基本上,不管出于什么原因,CakePHP忽略了包含一个只更新一个字段的函数,所以您必须将它放入一个带有updateAll的数组中才能使其工作


+100是更新信息的位置,因此在本例中,“100”将是字段更新的位置。

在cakephp 3.x中,语法似乎有所不同。这就是我在3.x中的工作原理:

$this->Tests->updateAll(
    [
        'Tests.field = Tests.field+100'
    ],
    [
        'Tests.id' => 1
    ]
];

不同之处在于整个表达式需要位于第一个数组的值中。

正如我所说,我确实读过它。。我在解释它时遇到了一些困难,如果这个问题看起来很简单,我很抱歉,只是烹饪书的措辞没有尽可能清晰IMO@Rick,嗯,我想这本食谱很快就会成为你的好朋友。慢慢来:)我尝试了你的代码,但我遇到了一个错误:解析错误:语法错误,第121行的/var/www/site1/app/controllers/hushmail/hushmails_controller.php中出现意外的T_双_箭头,因此我认为在使用=>时一定存在一些错误,只需注意一下(因为我看到已经有两个答案),当您在本地机器上工作时,将debug(in core.php)设置为2。这会转储所有SQL(以及其他有用的信息),因此您总是知道在您的情况下到底发生了什么或没有发生什么。。。它打印出一个看起来正确的查询,但它只是没有在我的数据库中执行操作,它坚持添加一个新字段,而不是更新我指定的字段。感谢您的澄清,我现在理解了这个问题。。我只是希望cakephp烹饪书中有更多的例子,但我想现在我想,以这里描述的答案这样的方式来做是非常直接的事实。。。。我试过了,但它仍然在创建一个新字段,没有用我指定的ID更新该字段。我想我仍然在苦苦思索为什么它总是插入一个新字段,而不是更新我想要的字段。请确保db表中的ID列是唯一的&自动递增。这将返回一个错误“SQL错误:1062:密钥'PRIMARY'的重复条目'$key'”因此我认为这是在尝试先插入而不是更新
pr()
您的数据,以确保行中有一个id。此外,您还需要确保只返回1行。