主页/PHP笔记/PHP问答/框架Laravel/Laravel 查询构造器中的 Upsert:教程与示例

Laravel 查询构造器中的 Upsert:教程与示例

Bug编译狮

Bug编译狮

标题:Laravel 查询构造器中的 Upsert:教程与示例

Laravel 是一个强大的 PHP 框架,它提供了丰富的工具和功能来简化开发过程。在处理数据库操作时,Upsert(即插入或更新)是一种常见的需求。Laravel 提供了方便的查询构造器来实现这一功能。下面我们将通过一个简单的示例,介绍如何使用 Laravel 的查询构造器进行 Upsert。

1. 安装 Laravel

首先,确保你已经安装了 Laravel。如果没有安装,可以通过 Composer 进行安装:

composer create-project --prefer-dist laravel/laravel my-laravel-app
cd my-laravel-app

2. 创建模型

创建一个模型来表示你的表结构。假设我们有一个名为 User 的表,并且这个表中有 id, name, 和 email 字段。

php artisan make:model User

打开 app/Models/User.php 文件,添加以下属性和方法:

namespace AppModels;

use IlluminateDatabaseEloquentModel;
use IlluminateSupportFacadesDB;

class User extends Model
{
    protected $fillable = ['name', 'email'];

    public function upsert(array $data)
    {
        DB::table('users')
            ->updateOrInsert($data, [
                'id' => $data['id'],
            ]);
    }
}

3. 使用 Upsert 方法

现在,我们可以使用 upsert 方法来执行 Upsert 操作。以下是一个示例代码:

use AppModelsUser;

$userData = [
    'id' => 1,
    'name' => 'John Doe',
    'email' => 'john.doe@example.com',
];

try {
    User::upsert($userData);
    echo "Upsert successful!";
} catch (Exception $e) {
    echo "Upsert failed: " . $e->getMessage();
}

在这个示例中,我们尝试插入一条数据。如果该数据已经存在于表中,则会更新这条记录;否则,会插入新记录。

4. 示例数据

为了更好地理解 Upsert 功能,让我们添加一些示例数据并进行测试:

$userData1 = [
    'id' => 1,
    'name' => 'John Doe',
    'email' => 'john.doe@example.com',
];

$userData2 = [
    'id' => 2,
    'name' => 'Jane Smith',
    'email' => 'jane.smith@example.com',
];

User::upsert($userData1); // 插入或更新用户 1
User::upsert($userData2); // 插入或更新用户 2

运行上述代码后,你会看到输出:

Upsert successful!
Upsert successful!

这表明数据已经成功插入或更新。

总结

通过以上步骤,我们展示了如何在 Laravel 中使用查询构造器进行 Upsert 操作。这种方法简单易用,适用于大多数需要插入或更新数据的需求。希望这个教程对你有所帮助!

黑板Bug讲师

黑板Bug讲师

概览

在使用Laravel构建Web应用时,开发人员常常遇到需要更新现有记录或如果它尚未存在则创建新记录的情景。这是一项常见的任务,称为“upsert”,即“更新或插入”。本教程将指导您通过Laravel查询构造器中的步骤来使用“upsert”功能,包括从基础到更高级的应用程序的各种示例。

Upsert(更新或插入)在Laravel中的使用介绍。

Laravel 8 引入了一种简洁明了的上推(upsert)操作方式,无需复杂的查询或条件块。在此之前,开发人员通常需要编写逻辑来检查记录是否存在,然后决定是否更新现有条目还是插入新条目。现在有了 Laravel 中的新上推方法,开发者可以在单个查询中完成此操作,从而减少代码复杂性和潜在错误。

理解基本概念

在进行Laravel中的upsert操作之前,让我们先了解一下基础知识:


DB::table('users')->upsert(
    [
        ['email' => '[email protected]', 'name' => 'John Doe'],
        ['email' => '[email protected]', 'name' => 'Jane Doe']
    ],
    ['email'],
    ['name']
);

在上述例子中,upsertLaravel 的 Fluent 查询构建器提供的方法用于执行我们的 Upsert 操作。该方法接受三个参数:

第三个论点是,如果找到匹配记录,则应该更新哪些列。

第二条参数由Laravel决定是否记录已存在的列组成。

第一个参数是一个包含要插入或更新记录的数组。

在我们的情况下,如果数据库中有相同电子邮件的用户,Laravel 将更新该用户的名称;如果没有,则插入新记录。

基本更新插入操作

让我们从简单的插入更新操作开始,以用户为例。想象一下我们想要向数据库插入一个新用户,电子邮件为'[email protected]’,但是如果这个邮箱已经存在,则只希望更新用户的名称为’New User’。以下是使用Laravel的查询构建器实现这一目标的方法:


use IlluminateSupportFacadesDB;

DB::table('users')->upsert(
    [
        'email' => '[email protected]', 'name' => 'New User'
    ],
    'email',
    'name'
);

这是一个非常简单的示例,该示例根据唯一键(在这种情况下为’email’)更新单个条目。

高级更新插入操作

当你对基本的插入和更新操作(upsert)变得越来越熟练时,可能会发现自己需要执行更复杂的 upsert 操作。例如,您可能希望同时更新多个字段或根据多个唯一键运行 upsert 操作。下面是演示如何进行多字段 upsert 的示例:


DB::table('users')->upsert(
    [
        'email' => '[email protected]',
        'name' => 'Existing User',
        'votes' => 100
    ],
    'email',
    ['name', 'votes']
);

在该示例中,如果 ‘[email protected]’ 已经存在,则Laravel 会同时更新 ‘name’ 和 ‘votes’ 列;否则,它会插入新的记录,包括所有三个值。

与复合键工作

有时,你需要根据多个列来识别记录。Laravel 的 upsert 方法也支持复合键用于此目的。这里是如何使用复合键进行 upsert 的方法:


DB::table('user_votes')->upsert(
    [
        ['user_id' => 1, 'campaign_id' => 2, 'votes' => 3],
        ['user_id' => 2, 'campaign_id' => 3, 'votes' => 4],
    ],
    ['user_id', 'campaign_id'],
    'votes'
);

该操作使用“用户ID”和“广告活动ID”作为复合键,检查现有记录是否存在,在决定更新“投票”列还是插入新记录之前进行判断。

使用Eloquent处理插入操作(Upserts)

虽然本教程重点介绍使用Laravel的查询构建器,但同样值得提及的是,你可以使用Laravel的Eloquent ORM进行upsert操作。语法非常相似:


use AppModelsUser;

User::upsert(
    [
        ['email' => '[email protected]', 'name' => 'John Doe'],
        ['email' => '[email protected]', 'name' => 'Jane Doe']
    ],
    ['email'],
    ['name']
);

这个片段将执行与我们初始的查询构建器示例相同的操作,但使用用户模型。

结论。

总结一下,Laravel的upsert功能简化了数据库操作,允许您编写更简洁和高效的代码。正确理解和使用upsert可以提高应用程序中的数据库交互可读性和可维护性。从基础示例到更复杂的场景,本教程旨在为您提供在Laravel查询构建器中利用upsert技能所需的能力。

长工码奴1523

长工码奴1523

在 Laravel 中,Upsert 是一个非常有用的函数,它允许你在现有数据上添加新值,并更新已存在的数据。这个功能非常适合当你要插入一个新的实体并同时更新另一个实体时。

如何使用 Upsert

首先,你需要确保已经安装了 Laravel 的基本依赖库,然后通过以下命令安装 Laravel 模块:

composer require laravel/ui

接下来,创建一个新的控制器来处理 Upsert 功能。假设我们要处理用户表的两个模型(User 和 Role):

  1. app/Http/Controllers 目录下创建一个新的文件:

    namespace AppHttpControllers;
    
    use IlluminateHttpRequest;
    use AppUser;
    use AppRole;
    
    class UserController extends Controller
    {
       /**
        * Display a listing of the resource.
        *
        * @return IlluminateHttpResponse
        */
       public function index()
       {
           // Your code here...
       }
    
       /**
        * Show the form for creating a new resource.
        *
        * @return IlluminateHttpResponse
        */
       public function create()
       {
           return view('create');
       }
    
       /**
        * Store a newly created resource in storage.
        *
        * @param  IlluminateHttpRequest  $request
        * @return IlluminateHttpResponse
        */
       public function store(Request $request)
       {
           $this->validate($request, [
               'name' => 'required|string|max:255',
               'email' => 'required|email|unique:users,email',
               'password' => 'required|min:6',
               'role_id' => 'required|exists:roles,id'
           ]);
    
           User::create([
               'name' => $request->input('name'),
               'email' => $request->input('email'),
               'password' => bcrypt($request->input('password')),
               'role_id' => $request->input('role_id')
           ]);
    
           if ($request->hasFile('image')) {
               $image = $request->file('image');
               $filename = time() . '_' . $image->getClientOriginalName();
               $image->move(public_path('/uploads'), $filename);
               User::first()->update(['image' => '/uploads/' . $filename]);
           }
    
           return redirect('/users')->with('success', 'User has been created successfully.');
       }
    
       /**
        * Display the specified resource.
        *
        * @param  int  $id
        * @return IlluminateHttpResponse
        */
       public function show($id)
       {
           //
       }
    
       /**
        * Show the form for editing the specified resource.
        *
        * @param  int  $id
        * @return IlluminateHttpResponse
        */
       public function edit($id)
       {
           //
       }
    
       /**
        * Update the specified resource in storage.
        *
        * @param  IlluminateHttpRequest  $request
        * @param  int  $id
        * @return IlluminateHttpResponse
        */
       public function update(Request $request, $id)
       {
           //
       }
    
       /**
        * Remove the specified resource from storage.
        *
        * @param  int  $id
        * @return IlluminateHttpResponse
        */
       public function destroy($id)
       {
           //
       }
    }
  2. 确保控制器有正确的路由定义:

    Route::resource('users', UserController::class);
  3. 创建迁移文件并执行:

    php artisan make:migration create_users_table --create=users
    php artisan migrate
  4. 最后,运行应用并测试 Upsert 功能:

    php artisan serve

现在你可以尝试插入和更新用户的实例。例如,要插入一个新的用户并设置其角色:

curl -X POST http://localhost:8000/users -H "Content-Type: application/json" 
    -d '{  "name": "John Doe",  "email": "johndoe@example.com",  "password": "password",  "role_id": 1 }'

这将返回一个包含用户ID的新响应:

{
  "message": "User has been created successfully.",
  "id": 1,
  "name": "John Doe",
  "email": "johndoe@example.com"
}

如果你想更新用户的角色,只需提供新的角色ID:

curl -X PUT http://localhost:8000/users/1 -H "Content-Type: application/json" 
    -d '{  "role_id": 2 }'

这会更新用户角色为第二个角色:

{
  "message": "User has been updated successfully.",
  "id": 1,
  "name": "John Doe",
  "email": "johndoe@example.com",
  "role_id": 2
}

这就是如何使用 Laravel 的 Upsert 功能来处理用户和角色。希望这对您有所帮助!