【问题标题】:Laravel firstOrCreate without EloquentLaravel firstOrCreate 没有 Eloquent
【发布时间】:2021-03-09 13:51:05
【问题描述】:

Eloquent 有一个 firstOrCreate 方法,它可以根据条件获取模型,如果不存在则创建它。

在 Laravel 的查询构建器中是否有任何等效的方法(即不在 Eloquent 中)?例如:

$row = DB::table('users')->where('user_id', 5)->firstOrCreate('name' => 'Peter', 'last_name' => 'Pan');

这将尝试从users'user_id'==5 获取一行。如果它不存在,它将插入具有该 ID 号的行以及其他提到的字段。

编辑:我不想将我的问题应用于用户。我以用户为例,尽可能清楚地说明我在寻找什么。

【问题讨论】:

  • 为什么你不想使用 Eloquent ?
  • 我不这么认为 - 您可以查看构建器来源:laravel.com/api/5.7/Illuminate/Database/Query/Builder.html 但您不太可能找到它。
  • @MD.JubairMizan 这个例子有点不幸,因为用户非常适合 Eloquent。我实际上是在尝试创建一个简单的系统,我认为在 Eloquent 中创建模型会有点过头了。
  • @Racso 用户模型随 Laravel 一起提供。在这里不使用它似乎毫无意义。创建模型也很容易,如果您遵循约定,Eloquent 几乎不需要任何配置。

标签: laravel


【解决方案1】:

updateOrInsert 具有空值的函数给我的结果类似于firstOrCreate

【讨论】:

  • 非常适合我使用相同的数据库结构更新多个 Laravel 应用程序,其中数据库的名称和数量是未知的。
【解决方案2】:

不,Laravel firstOrCreate 是函数,接下来说:

public function firstOrCreate(array $attributes, array $values = [])
{
    if (! is_null($instance = $this->where($attributes)->first())) {
        return $instance;
    }

    return tap($this->newModelInstance($attributes + $values), function ($instance) {
        $instance->save();
    });
}

但是你可以用微查询添加它:

DB::query()->macro('firstOrCreate', function (array $attributes, array $values = [])  
{
   if ($record = $this->first()) {
      // return model instance
   }

   // create model instance
});

因此,您可以像使用 Eloquent 一样称呼它。

$record= DB::table('records')->where('alias', $alias)->firstOrFail();

【讨论】:

    【解决方案3】:

    是的,当然!只需使用普通 SQL 和 ->selectRaw( your conditions ) 并查找是否有您的规范所在的条目。

    https://laravel.com/docs/5.7/queries#raw-expressions

    【讨论】:

    • 原始选择与 firstOrCreate 相比如何?
    • @Devon 因为您可以使用 raw 执行普通查询?他说他想要一种不雄辩的方式
    • 这是关于 firstOrCreate 等效函数而不是原始查询
    猜你喜欢
    • 1970-01-01
    • 2014-07-20
    • 2022-01-26
    • 1970-01-01
    • 2016-05-09
    • 2014-06-04
    • 2019-05-21
    • 2018-11-09
    • 2015-07-27
    相关资源
    最近更新 更多