当前位置: 首页 > 知识库问答 >
问题:

创建和更新Laravel Elount

史骏祥
2023-03-14

插入新记录或更新(如果存在)的缩写是什么?

<?php

$shopOwner = ShopMeta::where('shopId', '=', $theID)
    ->where('metadataKey', '=', 2001)->first();

if ($shopOwner == null) {
    // Insert new record into database
} else {
    // Update the existing record
}

共有3个答案

宰鸿博
2023-03-14

就像在Laravel一样

例如,对于提出的问题,您可以使用以下内容:

$matchThese = ['shopId'=>$theID,'metadataKey'=>2001];
ShopMeta::updateOrCreate($matchThese,['shopOwner'=>'New One']);

上面的代码将检查ShopMeta表示的表,除非在模型本身中没有定义,否则它很可能是shop_metas

它将尝试使用

shop Id=$theID

metadateKey=2001

如果找到,它将把找到的行的列shop Owner更新为New One

如果它找到多个匹配行,那么它将更新第一行,这意味着该行具有最低的主id

如果根本找不到,则将插入一个新行,其中包含:

shopId=$theIDmetadateKey=2001shopOwner=New

注意检查您的模型是否有$fillable,并确保您在其中定义了要插入或更新的每个列名,其余列具有默认值或其id列自动递增1。

否则在执行上述示例时将抛出错误:

Illuminate\Database\QueryException with message 'SQLSTATE[HY000]: General error: 1364 Field '...' doesn't have a default value (SQL: insert into `...` (`...`,.., `updated_at`, `created_at`) values (...,.., xxxx-xx-xx xx:xx:xx, xxxx-xx-xx xx:xx:xx))'

因为在插入新行时会有一些字段需要值,这是不可能的,因为它不是在$fillable中定义的,或者它没有默认值。

有关更多参考,请参阅Laravel文档:https://laravel.com/docs/5.3/eloquent

其中一个例子是:

// If there's a flight from Oakland to San Diego, set the price to $99.
// If no matching model exists, create one.
$flight = App\Flight::updateOrCreate(
    ['departure' => 'Oakland', 'destination' => 'San Diego'],
    ['price' => 99]
);

这几乎清除了一切。

有人问是否可以在Laravel中使用查询生成器。以下是Laravel docs中查询生成器的参考。

查询生成器的工作原理与雄辩的完全相同,所以任何对雄辩的东西都是对查询生成器也是如此。因此,对于这种特殊情况,只需对查询生成器使用相同的函数,如:

$matchThese = array('shopId'=>$theID,'metadataKey'=>2001);
DB::table('shop_metas')::updateOrCreate($matchThese,['shopOwner'=>'New One']);

当然,不要忘记添加DB facade:

use Illuminate\Support\Facades\DB;

use DB;

钱锐
2023-03-14

以防万一人们还是会遇到这个。。。我在写这篇文章几周后发现,这实际上是拉雷维尔雄辩的核心的一部分。。。

深入探讨雄辩的等效方法。你可以在这里看到:

https://github.com/laravel/framework/blob/4.2/src/Illuminate/Database/Eloquent/Model.php#L553

on:570和:553

    /**
     * Create or update a record matching the attributes, and fill it with values.
     *
     * @param  array  $attributes
     * @param  array  $values
     * @return static
     */
    public static function updateOrCreate(array $attributes, array $values = array())
    {
        $instance = static::firstOrNew($attributes);

        $instance->fill($values)->save();

        return $instance;
    }

下面是老答案

我想知道是否有任何内置的L4功能可以通过以下方式实现:

$row = DB::table('table')->where('id', '=', $id)->first();
// Fancy field => data assignments here
$row->save();

几周前我创造了这个方法。。。

// Within a Model extends Eloquent
public static function createOrUpdate($formatted_array) {
    $row = Model::find($formatted_array['id']);
    if ($row === null) {
        Model::create($formatted_array);
        Session::flash('footer_message', "CREATED");
    } else {
        $row->update($formatted_array);
        Session::flash('footer_message', "EXISITING");
    }
    $affected_row = Model::find($formatted_array['id']);
    return $affected_row;
}

我希望这能有所帮助。如果有人有别的选择可以分享,我很乐意看到。@erikthedev_

时经纬
2023-03-14

这里有一个“lucip”所说的完整例子:

$user = User::firstOrNew(array('name' => Input::get('name')));
$user->foo = Input::get('foo');
$user->save();

以下是最新版本Laravel上文档的更新链接

这里的文档:更新的链接

 类似资料:
  • 创建 var newRecord = {}; newRecord.id = 1; newRecord.name = "John" Person.create(newRecord, function(err, results) { ... }); 保存 Person.find({ surname: "Doe" }, function (err, people) { // SQL: "SEL

  • 问题内容: 插入新记录或更新(如果存在)的快捷方式是什么? 问题答案: 这是“ lu cip”正在谈论的完整示例: 以下是Laravel最新版本上的文档更新链接 此处的文档:更新的链接

  • 问题内容: 我想定义具有2个TIMESTAMP字段的表,如下所示: 如何避免错误: 重点是保持表架构中和的所需行为。 问题答案: 猜猜这是一个老帖子,但实际上我想mysql在其最新版本中支持2 TIMESTAMP mysql 5.6.25,这就是我目前使用的时间。

  • 本文向大家介绍MongoDB的创建、更新和删除,包括了MongoDB的创建、更新和删除的使用技巧和注意事项,需要的朋友参考一下 概要   下面开始学习MongoDB最重要也是最基础的部分:C(创建)R(查询)U(更新)D(删除);由于R(查询)操作相对来说内容比较多,也比较繁琐,   同时使用频率也比较高,所以下一篇会拿出来单独介绍。废话不多说,连上服务器,我们直接进入正题! 一、创建   按照我

  • 目前,我正在用一个查询检查该项是否存在,然后使用put或updateItem,我想更改它并对DDB进行一次调用。我想进行一个将更新或创建项目的查询。 下面是我的项目的一个例子: 项目类型: 如果项目存在,我想推送一个新项目,比如{papa:'dsfadsf'}(永远不要修改fa映射内的现有项目),并修改pa映射内的finish值 这是更新后的项目: 这是我尝试的,但不起作用

  • 我有一个相当棘手的问题。 我所拥有的: