【问题标题】:Laravel eloquent update record without loading from databaseLaravel eloquent 更新记录,无需从数据库加载
【发布时间】:2015-06-18 03:05:25
【问题描述】:

我对 laravel 很陌生,我正在尝试从表单的输入中更新记录。但是我看到要更新记录,首先您需要从数据库中获取记录。 不可能更新记录(设置了主键):

$post = new Post();
$post->id = 3; //already exists in database.
$post->title = "Updated title";
$post->save();

【问题讨论】:

标签: php eloquent laravel-5


【解决方案1】:
Post::where('id',3)->update(['title'=>'Updated title']);

【讨论】:

  • 已确认,这是无需执行 fetch 即可更新的 Eloquent 方式
  • 我希望首先显示这个答案,因为它是正确的答案 - 使用 Eloquent,而不是查询生成器。
  • 如果出现问题,是否会回滚?我的意思是,DB::beginTransaction() 支持吗?
  • 当然它与DB::beginTransaction()一起工作,因为它是一个修改表的语句,数据库引擎会将它解释为一个真正的事务。
  • @Kajasb 是否有任何可以在没有新查询的情况下获取此更新记录?
【解决方案2】:

您可以简单地使用 Query Builder 而不是 Eloquent,此代码直接更新您在数据库中的数据 :) 这是一个示例:

DB::table('post')
            ->where('id', 3)
            ->update(['title' => "Updated Title"]);

您可以在此处查看文档以获取更多信息:http://laravel.com/docs/5.0/queries#updates

【讨论】:

  • 谢谢一百万 .. 你让我开心
  • 否,因为那样你会丢失时间戳和其他模型行为
  • @malhal 不幸的是,我还没有找到使用 Eloquent 修复这种情况的任何解决方案,因为 Eloquent 基本上为每一行创建对象以便能够拥有所有这些功能。因此,要在不加载和更新每一行的情况下更新它们是根本不可能的。 CMIIW
  • 在这种情况下,您如何检查给定行是否确实已更新?喜欢if ($data->save())
  • @malhal 请参阅 KaJasB 为任何想要使用 eloquent 进行更新的人提供的以下回答。
【解决方案3】:

使用属性exists

$post = new Post();
$post->exists = true;
$post->id = 3; //already exists in database.
$post->title = "Updated title";
$post->save();

这里是 API 文档:http://laravel.com/api/5.0/Illuminate/Database/Eloquent/Model.html

【讨论】:

  • 老实说,这有点难读。
【解决方案4】:

常见的方式是加载要更新的行:

$post = Post::find($id);

我是你的情况

$post = Post::find(3);
$post->title = "Updated title";
$post->save();

但只需一步(只需更新),您就可以做到这一点:

$affectedRows = Post::where("id", 3)->update(["title" => "Updated title"]);

【讨论】:

  • @zairwolf:这个答案没有错。这也是获取记录对象和更新特定字段的好方法。
  • 他想避免获取记录。我来到这里是因为我有一个循环,我想在其中更新一些行,我无法获取记录,这太混乱了,最重要的是效率低下
  • 先阅读问题。发布问题的用户已经明确表示 Without Loading 实际上。你的答案是加载数据来更新它。
【解决方案5】:

您也可以使用firstOrCreatefirstOrNew

// Retrieve the Post by the attributes, or create it if it doesn't exist...
$post = Post::firstOrCreate(['id' => 3]);
// OR
// Retrieve the Post by the attributes, or instantiate a new instance...
$post = Post::firstOrNew(['id' => 3]); 

// update record
$post->title = "Updated title";
$post->save();

希望对你有帮助:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-29
    • 1970-01-01
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    相关资源
    最近更新 更多