为了账号安全,请及时绑定邮箱和手机立即绑定

Laravel:避免数据库中的重复条目

Laravel:避免数据库中的重复条目

PHP
ibeautiful 2021-12-03 15:14:25
我正在构建一个 Laravel API。我有一个名为 Reservations 的模型。我想避免用户为相同的产品和时间段创建两个预订。我有以下几点:$reservation =  Reservation::firstOrCreate([   'listing_id'    =>  $request->listing_id,   'user_id_from'  =>  $request->user_id_from,   'start_date'    =>  $request->start_date,   'end_date'      =>  $request->end_date,]);return new ReservationResource($reservation);文档说:firstOrCreate 方法将尝试使用给定的列/值对定位数据库记录上面的代码正在工作:如果项目尚不存在,它会将项目添加到数据库中(在这种情况下,对 REST API 的回复返回正确的新模型实例。如果组合等于 ,则不会将该项目添加到数据库中listing_id, user_id_from, start_date and end_date。但是,在后一种情况下(项目已经存在),它也会在 REST API 中返回一个带有匹配行 ID 的保留。示例:在下表中,已存在 ID 为 2 的预订:id  listing_id  user_id_from    start_date  end_date------------------------------------------------------  1      2            3               2019-09-12  2019-10-14  发送以下 REST API 请求:{    "listing_id": 2,    "user_id_from": 3,    "start_date": "2019-09-12",    "end_date": "2019-10-14",}回报"data": {    "id": 1,    "user_id_from": 3,    "listing_id": 2,    "price": 388,    "start_date": "2019-09-12",    "end_date": "2019-10-14", }我想要一个 JSON 回复,说明该项目已经存在。如何做到这一点?
查看完整描述

2 回答

?
陪伴而非守候

TA贡献1757条经验 获得超8个赞

firstOrCreate()正如您所期望的那样,它只是一个由两部分组成的函数first(),create()如果不存在则进行查找和回退。您可以在控制器中实现几乎相同的逻辑,first()如果结果存在,则将消息附加到结果,并在创建时按原样返回结果。或者,您可以根据结果使用HTTP_OK或修改响应HTTP_CREATED。或两者。


public function store(Request $request)

{

    $attributes = [

        'listing_id' => $request->input('listing_id'), 

        'user_id_from' => $request->input('user_id_from'), 

        'start_date' => $request->input('start_date'),

        'end_date' => $request->input('end_date')

    ];


    // return existing reservation if exists

    $reservation = Reservation::where($attributes)->first();


    if ($reservation !== null) {

        // add explicit message here if you want

        return response(json_encode($reservation), Response::HTTP_OK);

    }


    // else create a new one

    $reservation = Reservation::create($attributes);


    // reload model

    $reservation = Reservation::find($reservation->id);


    return response(json_encode($reservation), Response::HTTP_CREATED);

}


查看完整回答
反对 回复 2021-12-03
?
慕码人2483693

TA贡献1860条经验 获得超9个赞

我认为您正在寻找 Laravel 的wasRecentlyCreated:


if(! $reservation->wasRecentlyCreated){ 

      // create & encode a JSON response  or use this variable & method on the blade page

}


查看完整回答
反对 回复 2021-12-03
  • 2 回答
  • 0 关注
  • 253 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信