CakePHP updateAll()不起作用

Posted

技术标签:

【中文标题】CakePHP updateAll()不起作用【英文标题】:CakePHP updateAll() not working 【发布时间】:2015-08-27 20:35:40 【问题描述】:

我使用的是 updateAll() 而不是教程建议的

$this->Post->id = $id;

我的表中没有 id 列。当我运行这段代码时 -

    public function edit($user_id = null) 
    if (!$user_id) 
        throw new NotFoundException(__('Invalid post'));
    

    $user_info = array('conditions' => array('User.user_ID' => $user_id));
    $user = $this->User->find('all', $user_info);
    if (!$user) 
        throw new NotFoundException(__('Invalid User ID'));
    

    if ($this->request->is('put')) 
        $data = $this->request->input('json_decode');
        //$this->set('new_user', $data);
        $this->User->updateAll(
        array( 'User.status' => 'ooactive' ), //fields to update
        array( 'User.user_id' => $user_id ));
    

我收到此错误 -

错误:SQLSTATE[42S22]:找不到列:1054 '字段列表'中的未知列 'ooactive' SQL 查询:UPDATE Smooch.users AS User SET User.status = ooactive WHERE User.user_id = 3

我不知道为什么会出现这个错误,任何帮助都会很棒,谢谢

编辑:

当前代码,我决定按照 Cakephp.org 上的博客教程中显示的方式进行 -

    public function edit($user_id = null) 
    if (!$user_id) 
        throw new NotFoundException(__('Invalid post'));
    

    $user_info = array('conditions' => array('User.user_ID' => $user_id));
    $user = $this->User->find('all', $user_info);
    if (!$user) 
        throw new NotFoundException(__('Invalid User ID'));
    

    if ($this->request->is('put')) 
         $this->User->user_id = "user_id";
         $data = $this->request->input('json_decode');
         if($this->User->save($data));
    

错误 -

错误:SQLSTATE[23000]:违反完整性约束:1062 键 'PRIMARY' 的重复条目 '0' SQL 查询:INSERT INTO Smooch.users (status) VALUES ('inaaaaaaaactive')

这把它变成了一个 INSERT 语句,不知道为什么。

【问题讨论】:

【参考方案1】:

嗯,没关系。文档说:(http://book.cakephp.org/2.0/en/models/saving-your-data.html#model-updateall-array-fields-mixed-conditions)

$fields 数组接受 SQL 表达式。文字值应该使用 DboSource::value() 手动引用。例如,如果您的模型方法之一正在调用 updateAll(),您将执行以下操作:

$db = $this->getDataSource();
$value = $db->value($value, 'string');
$this->updateAll(
    array('Baker.approved' => true),
    array('Baker.created <=' => $value)
);

所以,使用$db-&gt;value('ooactive', 'string') 来转义状态。

【讨论】:

我尝试了上述方法,但它导致了更多问题,所以我尝试回到官方 cakePHP 教程所说的方式 - $this->Post->id = $id;这就是我认为使它成为更新声明的神奇之处。如果我的主键是 user_id,我将如何设置此代码($this->Post->id = $id;)?我将更新我的帖子以反映当前代码。 您可以通过 $this->Post->primaryKey = 'field'; 将主键设置为其他字段我不知道这是否适合你。【参考方案2】:

如文档所述,updateAll() 不能像 2.x 中的 save() 一样使用。 您需要在逻辑上手动引用您的输入(并且错误消息指出您需要使用):

$this->User->updateAll( array( 'User.status' => '"ooactive"'), array( 'User.user_id' => $user_id ) );

【讨论】:

【参考方案3】:

$this->Bookcopy->updateAll(['Bookcopy.status' => 'AVAILABLE'],['Bookcopy.status'=>'REQUESTED'])

错误: SQLSTATE[42S22]:未找到列:1054 '字段列表'中的未知列 'AVAILABLE'

SQL 查询: UPDATE practice_bookchum.bookcopies AS Bookcopy LEFT JOIN practice_bookchum.books_stores AS Book_Store ON (Bookcopy.book_store_id = @98765432 @.id) 设置Bookcopy.status = 可用在Bookcopy.status = '请求'

Model::updateAll(数组 $fields, 混合 $conditions)

当我将 $fields 作为关联数组与值传递时发生错误

我做到了....

$db = $this->Bookcopy->getDataSource();
$value = 'AVAILABLE';
$value = $db->value($value, 'String');

$this->Bookcopy->updateAll(['status' => $value],['Bookcopy.status'=>'REQUESTED'])

data: "Borrow", status: "success"
data:"Borrow"
status:"success"

【讨论】:

以上是关于CakePHP updateAll()不起作用的主要内容,如果未能解决你的问题,请参考以下文章

CakePHP 3 的关联限制不起作用

CakePHP 2.3.2 BasicAuthentication 不起作用

Cakephp 在 IIS 中不起作用?

CakePHP 多选“选中”不起作用

Cakephp 3:Json 渲染视图不起作用

cakephp函数更新一行不起作用