Laravel:调用未定义方法Illuminate\Database\Eloquent\Collection :: save()

8

我基本上是想从我的表中获取特定行并更新它,但是我最终得到的是一个集合,其中保存方法未定义,正如我的标题中所说的错误。您能告诉我以下代码有什么问题吗?我也尝试过不使用get方法。但在这种情况下,我会得到不同的错误。此外,请让我知道如果有更好的方法来检索具有两个主键(userId,folderName)的表中的行。谢谢 :)

$tempFolder =   Message_Folders::where('userId',"=",1)->where('folderName',"=",$imap_folder['name'])->get();
if($tempFolder==null){//If not existing, however in this example assume that it exists
        $tempFolder =  new Message_Folders();
        $tempFolder->userId = 1;    
        $tempFolder->folderName = $imap_folder['name'];
        }
        $tempFolder->flags = $imap_folder['status']->flags;
        $tempFolder->messages = $imap_folder['status']->messages;
        $tempFolder->recent = $imap_folder['status']->recent;
        $tempFolder->unseen = $imap_folder['status']->unseen;
        $tempFolder->uidnext = $imap_folder['status']->uidnext;
        $tempFolder->uidvalidity = $imap_folder['status']->uidvalidity;
        $tempFolder->save();

编辑1:

按照第一个答案中提到的更新代码后,现在我得到了一个新的错误。

SQLSTATE [42S22]:Column not found: 1054 在'where clause'中未知的列'id'(SQL:update message_folders set recent = 4,updated_at=2014-03-08 13:34:10 where id is null)

请参考以下代码:(此外,如果所有值都相同,则可以正常工作(因为实际上没有进行更新))

$tempFolder =   $this->folders->where('userId',"=",1)->where('folderName',"=",$imap_folder['name'])->first();
        if($tempFolder==null){
        $tempFolder =  new Message_Folders();
        $tempFolder->userId = 1;    
        $tempFolder->folderName = $imap_folder['name'];
        }
        $tempFolder->flags = $imap_folder['status']->flags;
        $tempFolder->messages = $imap_folder['status']->messages;
        $tempFolder->recent = 4;
        $tempFolder->unseen = $imap_folder['status']->unseen;
        $tempFolder->uidnext = $imap_folder['status']->uidnext;
        $tempFolder->uidvalidity = $imap_folder['status']->uidvalidity;

        $tempFolder->save();

编辑2:上述代码中提到的表的迁移文件部分:
public function up()
    {
        Schema::create('message_folders', function(Blueprint $table) {
           $table->integer('userId');
           $table->string('folderName', 200);
           $table->integer('flags');
           $table->integer('messages');
           $table->integer('recent');
           $table->integer('unseen');
           $table->integer('uidnext');
           $table->integer('uidvalidity');
           $table->timestamps();
           $table->primary(array('userId','folderName'));
        });
    }
1个回答

26
以下代码行使用查询构建器的 get 方法:
$tempFolder =   Message_Folders::where('userId',"=",1)->where('folderName',"=",$imap_folder['name'])->get();

它将检索该模型中符合where条件的所有行。因此,您将获得一个集合而不是该模型的实例。

要从查询结果中检索单个行,您可以使用first方法:

//returns a single row from the query
$tempFolder =   Message_Folders::where('userId',"=",1)->where('folderName',"=",$imap_folder['name'])->first();

所以,基本上我只是按照你的建议尝试了一下,现在我又遇到一个新错误。请查看更新后的代码。我认为它正在尝试查找一个名为“id”的列(但我不知道为什么,因为我没有这个名称的列)。 - Chintan Parekh
是的,如果你只想要一行数据,那么使用 first。如果你正在访问一个动态属性,那么 Laravel 会知道它是否需要调用 get 方法(对于一对多关系)或 first 方法(对于一对一关系)。 - marcanuy
好的,谢谢你提供的答案。我已经检查过了,没有Id列。你想让我分享我的迁移代码吗? - Chintan Parekh
另外,补充一点。如果我输入相同的旧值,它可以很好地工作,不会抛出任何错误。 - Chintan Parekh
刚刚发现 Eloquent 只期望单个主键。您可以像这里解释的那样覆盖更新方法:http://forumsarchive.laravel.io/viewtopic.php?pid=41384#p41384 - marcanuy
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接